Count Even Numbers
Gegeben ist eine nicht leere Liste von Ganzzahlen nums. Gib zurück, wie viele ihrer Werte gerade sind. Eine Zahl ist gerade, wenn bei der Division durch 2 kein Rest bleibt. Dazu gehören 0 und negative Zahlen wie -4.
Funktion
- numsinteger-array
- die Liste der zu überprüfenden Ganzzahlen
- Gibt zurückinteger
- die Anzahl der geraden Werte in nums
Einschränkungen
1 ≤ nums.length ≤ 5000-109 ≤ nums[i] ≤ 109
Beispiele
- Eingabe
- nums = [3, 8, 12, 5, 6]
- Ausgabe
- 3
- Erklärung
8,12und6sind ohne Rest durch2teilbar;3und5sind es nicht. Die Antwort ist3.
- Eingabe
- nums = [-4, -3, 0, 7]
- Ausgabe
- 2
- Erklärung
-4 = 2 × (-2)und0 = 2 × 0, also sind beide gerade.-3und7sind ungerade, und die Anzahl beträgt2.
- Eingabe
- nums = [1, 9, 15]
- Ausgabe
- 0
- Erklärung
1,9und15sind alle ungerade, also ist die Antwort0.
Weiterführende Frage
Du erhältst viele Fragen: Wie viele geraden Werte liegen zwischen dem Index l und dem Index r? Kannst du nach einem Durchlauf über nums jede Frage in O(1)-Zeit beantworten?
Tipps
Öffne sie nacheinander. Jeder verrät ein bisschen mehr.
Was bleibt übrig, wenn du eine gerade Zahl durch
2teilst?Ein Wert
xist genau dann gerade, wennx % 20ist. Achtung: Bei einer negativen ungeraden Zahl liefern manche Sprachen als Rest-1statt1.Starte einen Zähler bei
0, lies jeden Wert einmal und addiere1, wann immer der Rest bei Division durch20ist.
Lösung
Prüfe jeden Wert einmal und zähle diejenigen, bei denen beim Teilen durch 2 der Rest 0 ist. Den Rest mit 0 zu vergleichen, statt mit 1 auf Ungerade zu prüfen, funktioniert auch bei negativen Zahlen korrekt.
Sammle die geraden Werte und zähle sie dann.
Idee
Wähle mit einem Filter die geraden Werte aus und gib dann die Länge des Ergebnisses zurück. Für [3, 8, 12, 5, 6] lautet die gefilterte Liste [8, 12, 6], also ist die Antwort 3.
Der Zeitaufwand beträgt O(n), aber die neue Liste benötigt O(n) Speicherplatz für bis zu 5000 Werte, nur um ihre Länge einmal auszulesen.
Algorithmus
- Erstelle eine neue Liste, die jedes
xinnumsenthält, für dasx % 2 == 0gilt. - Gib die Länge dieser Liste zurück.
def countEvens(nums):
evens = [x for x in nums if x % 2 == 0]
return len(evens)Zähle mit einem laufenden Zähler
Idee
Verwende statt einer Liste einen Zähler und erhöhe ihn für jeden Wert mit x % 2 == 0 um 1. Bei einer geraden Zahl bleibt unabhängig von ihrem Vorzeichen der Rest 0, daher trifft die Bedingung in jeder Sprache auf -4 und 0 zu. Ein Test auf ungerade Zahlen mit x % 2 == 1 funktioniert dagegen nicht: In C, Java, JavaScript und den meisten C-ähnlichen Sprachen hat der Rest das Vorzeichen der Zahl, daher ist -3 % 2 gleich -1.
Ein Durchlauf und eine Ganzzahl: O(n) Zeit, O(1) Speicherplatz.
Algorithmus
- Setze
countauf0. - Durchlaufe jeden Wert
xinnums. - Wenn
x % 2 == 0, addiere1zucount. - Gib nach der Schleife
countzurück.
def countEvens(nums):
count = 0
for x in nums:
if x % 2 == 0: # 0 also works for negatives, where the remainder can be -1
count += 1
return count
Stolperfallen und Grenzfälle
- Die ungeraden Werte mit
x % 2 == 1zählen und von der Länge abziehen. In C-ähnlichen Sprachen ist-3 % 2gleich-1, daher gibt[-3]statt 0 den Wert 1 zurück. 0weder als gerade noch als ungerade behandeln.0 = 2 × 0, daher gibt[0]den Wert1zurück.- Den Bit-Test als
x & 1 == 0schreiben. In C, C++ und JavaScript bindet==stärker als&, daher bedeutet esx & (1 == 0), was immer0ergibt und nichts zählt. Schreibe(x & 1) == 0.
Häufige Fragen3
Wie prüfst du im Code, ob eine Zahl gerade ist?
Prüfe, ob der Rest nach der Division durch 2 null ist: x % 2 == 0. Das funktioniert für positive Zahlen, negative Zahlen und null, sogar in Sprachen, in denen -3 % 2 -1 ergibt. Du kannst auch das niedrigste Bit mit (x & 1) == 0 prüfen.
Ist null eine gerade Zahl?
Ja. Null geteilt durch 2 ergibt 0 ohne Rest und erfüllt somit die Definition einer geraden Zahl. Sie liegt außerdem zwischen den ungeraden Zahlen -1 und 1, wo eine gerade Zahl hingehört.
Wie hoch ist die Zeitkomplexität beim Zählen gerader Zahlen in einem Array?
Ein Durchlauf mit einem Zähler benötigt O(n) Zeit und O(1) zusätzlichen Speicherplatz. Jeder Wert muss überprüft werden, daher ist keine Methode schneller als O(n).
Ähnliche Aufgaben
Aufgaben mit denselben Ideen. Wer zwei oder drei davon löst, behält das Muster.
def countEvens(nums):
# Schreibe hier den CodeTest #1
Test #2
Test #3
Argument
nums = [3, 8, 12, 5, 6]
Erwartete Ausgabe
3