[Python-de] Noch eine Denksportaufgabe

Gerhard Häring haering_python at gmx.de
Thu Oct 10 18:57:21 EDT 2002


* Axel_Gerke at peacock.de <Axel_Gerke at peacock.de> [2002-10-10 16:30 +0100]:
> 
> Hallo zusammen,
> 
> Tino Wildenhain und meine Wenigkeit haben mal diese nette Aufgabe
> durchgesprochen
> und sind zu folgender Lösung gekommen:
> 
> >>> def nrotate(l,n):
> ...     n=n % len(l) # bound checking
> ...     return l[-n:]+l[:-n]

Der Haken bei eurer Lösung ist, dass sie nach dem Kriterium "versuche, den
Speicherverbrauch zu minimieren" der Aufgabe, so ziemlich die
schlechtmöglichste ist: Du erzeugst nämlich zwei neue Listen, die in der Summe
so viele Elemente wie die Ursprungsliste haben.

Eine speichersparende Variante muss also wirklich "in-place"
funktionieren, wie meine (die aber wg. der Verwendung von Listen
rausfällt).

Um sicherzustellen, dass man keine Listen-Features benutzt, sollte man
vielleicht wirklich array.array verwenden:

>>> import array
>>> lst = array.array('i', [1,2,3,4,5,6])
>>> lst
array('i', [1, 2, 3, 4, 5, 6])
>>>

Dann muss man sich nämlich was Schlaueres überlegen, z. B. einen Algorithmus
mit Vertauschung der Elemente, aber mir ist da auch noch nix eingefallen.

Im DSE-Wiki hat jemand eine Lösung mit XOR gefunden, aber auf die Schnelle hab
ich noch nicht verstanden, wie die funktioniert.

-- Gerhard




More information about the Python-de mailing list