Schreiben Sie eine Funktion, die ein ganzzahliges Array um eine bestimmte Zahl k dreht. k Elemente vom Ende sollten zum Anfang des Arrays verschoben werden, und alle anderen Elemente sollten nach rechts verschoben werden, um den Platz zu schaffen.
Die Drehung sollte an Ort und Stelle erfolgen.
Der Algorithmus sollte nicht in mehr als O (n) ausgeführt werden, wobei n die Größe des Arrays ist.
Außerdem muss ein konstanter Speicher verwendet werden, um die Operation auszuführen.
Zum Beispiel,
Wenn das Array mit Elementen initialisiert wird, ist arr = {1, 2, 3, 4, 5, 6, 7, 8, 9}
Durch Drehen (arr, 3) werden die Elemente zu {7, 8, 9, 1, 2, 3, 4, 5, 6}.
Drehen (arr, 6) führt zu {4, 5, 6, 7, 8, 9, 1, 2, 3}
popularity-contest
array-manipulation
mikrobiell
quelle
quelle
Antworten:
C (104)
Minimiert:
quelle
a <-- b
APL (4)
Ich bin nicht sicher, ob APL es tatsächlich benötigt, aber in der Implementierung, die ich gesehen habe (die Interna von), würde dies Zeit proportional zu
A
und konstanten Speicher benötigen .quelle
{⍵⌽⍨-⍺}
oder{⌽⍺⌽⌽⍵}
. In NARS2000 kann es elegant geschrieben werden als⌽⍢⌽
.Hier ist eine langwierige C-Version von Colins Idee.
quelle
O(log(n))
Operation. Schauen Sie sich anby
, 1 zu sein, Ihre "j" -Schleife ist s_arr / g oder N - das sind O (N) -OperationenC.
Ich bin mir nicht sicher, was die Kriterien sind, aber da ich Spaß mit dem Algorithmus hatte, ist hier mein Eintrag:
Ich werde es auch für ein gutes Maß Golf spielen; 126 Bytes können kürzer gemacht werden:
quelle
Ich sehe hier nicht sehr viele C ++ - Lösungen, also dachte ich mir, ich würde es versuchen, da es keine Zeichen zählt.
Dies ist eine echte "In-Place" -Rotation, verwendet also 0 zusätzlichen Platz (außer technisch Swap und 3 Ints) und erfüllt, da die Schleife genau N ist, auch die O (N) -Komplexität.
quelle
std::rotate
weil diese Art der Niederlage den ZweckWenn Sie jeden der möglichen Rotationszyklen nacheinander um n ausführen (es gibt GCD (n, len (arr)) davon), benötigen Sie nur eine einzige temporäre Kopie eines Array-Elements und einige Statusvariablen. So in Python:
quelle
cycle
Variable hat eine nicht konstante Größe. Sie müssen dieses Array im Laufe der Zeit generieren.C (137 Zeichen)
Funktion
rotate
auf 137 Zeichen reduziert:quelle
Factor verfügt über einen integrierten Typ für drehbare Arrays.
<circular>
Dies ist also eine O (1) -Operation:Ein weniger betrügerisches Faktoräquivalent zu Ben Voigts beeindruckender C-Lösung:
quelle
JavaScript 45
Ging sowieso zum Golf, weil ich Golf mag. Es ist maximal O (N), solange
t
<= Größe des Arrays ist.Um mit einem
t
beliebigen Anteil in O (N) umzugehen, kann Folgendes verwendet werden (mit einem Gewicht von 58 Zeichen):Wird nicht zurückgegeben, bearbeitet das Array an Ort und Stelle.
quelle
r(o,t) => rot
REBEL - 22
Eingabe: k ausgedrückt als unäre Ganzzahl unter Verwendung
_
einer Ziffer, gefolgt von einem Leerzeichen und einem durch Leerzeichen getrennten Array von Ganzzahlen.Ausgabe: Ein Leerzeichen, dann wird das Array gedreht.
Beispiel:
Endzustand:
Erläuterung:
Bei jeder Iteration wird eine
_
und ein Array[array] + tail
durch ersetzttail + [array]
.Beispiel:
quelle
O(n)
, und das tun Sien
mal.Java
Demo hier .
Minimiertes Javascript, 114 :
quelle
Haskell
Dies ist tatsächlich θ (n), da die Aufteilung θ (k) und die Verbindung θ (nk) ist. Ich bin mir jedoch nicht sicher über das Gedächtnis.
quelle
Python 3
Konstante
O (n) Zeitkomplexität des Speichers
quelle
Python
quelle
Python
quelle
vb.net O (n) (nicht konstanter Speicher)
quelle
Rubin
quelle
C (118)
Wahrscheinlich war es mit einigen Spezifikationen etwas zu nachsichtig. Verwendet Speicher proportional zu
shift % length
. Kann sich auch in die entgegengesetzte Richtung drehen, wenn ein negativer Verschiebungswert überschritten wird.quelle
Python 2, 57
Wenn es nur so
l[-n:len(l)-n]
funktionieren würde, wie ich es erwarten würde. Es kehrt nur[]
aus irgendeinem Grund zurück.quelle
Könnte jemand bitte prüfen, ob dies tatsächlich den Anforderungen entspricht? Ich denke schon, aber ich habe CS (noch) nicht studiert.
quelle
C ++, 136
quelle
Java
Tauschen Sie die letzten k Elemente gegen die ersten k Elemente aus und drehen Sie dann die verbleibenden Elemente um k. Wenn Sie am Ende weniger als k Elemente übrig haben, drehen Sie diese um k% der verbleibenden Elemente. Ich glaube nicht, dass irgendjemand oben diesen Ansatz gewählt hat. Führt genau eine Auslagerungsoperation für jedes Element aus und erledigt alles an Ort und Stelle.
quelle
Perl 5 , 42 Bytes
Probieren Sie es online aus!
Das Unterprogramm verwendet den zu drehenden Abstand als ersten Parameter und einen Verweis auf das Array als zweiten. Die Laufzeit ist basierend auf dem Rotationsabstand konstant. Die Arraygröße hat keinen Einfluss auf die Laufzeit. Das Array wird geändert, indem ein Element von rechts entfernt und links platziert wird.
quelle