Analysieren Nullverschiebungen 0️⃣

In den Kommentaren habt ihr fast alle denkbaren Lösungswege für die Aufgabe vorgestellt.

Natürlich ist das klassische Muster hier der Zwei-Zeiger-Ansatz.
Hier ist die ideale Lösung mit einer Komplexität von O(n) in der Zeit und O(1) im Speicher:

def move_zeroes(nums: list[int]) -> None:
insert_pos = 0

for i in range(len(nums)):
if nums[i] != 0:
# Tausche das Nicht-Null-Element mit der "linken" Null
nums[insert_pos], nums[i] = nums[i], nums[insert_pos]
insert_pos += 1


Keine Allokationen. Kein pop() aus der Mitte der Liste. Wir durchlaufen das Array genau einmal. Die Variable insert_pos zeigt immer auf die erste verfügbare Null. Sobald wir eine von Null verschiedene Zahl finden, tauschen wir sie einfach dank des eingebauten Tuple-Unpacking-Mechanismus in Python.

🐍 Aber es wäre nicht interessant ohne etwas Kniffligeres. Hier ist ein pythonischer Flex in einer Zeile ohne Generatoren:
nums.sort(key=bool, reverse=True)


Wie funktioniert das? bool(0) ergibt False, alle anderen Zahlen True. Die eingebaute Timsort-Sortierung in Python ist stabil – sie erhält die ursprüngliche Reihenfolge gleicher Elemente strikt. Alle True (Zahlen) wandern nach links, wobei ihre Reihenfolge erhalten bleibt, und alle False (Nullen) fliegen nach rechts.

Ja, formal hat dies eine Komplexität von O(n log n), was algorithmisch schlechter ist als der Zwei-Zeiger-Ansatz. Aber da Timsort in atemberaubendem C geschrieben ist, wird dieser Code bei realen Listen kleiner Größe physisch die reinen Python-Schleifen in der Ausführungsgeschwindigkeit übertreffen.

#algosobes