Update 2: Einige Leute denken, dass die Verwendung von XOR zum Auffinden der doppelten Nummer ein Hack oder Trick ist. Meine offizielle Antwort lautet: "Ich suche nicht nach einer doppelten Nummer, sondern nach einem doppelten Muster in einem Array von Bitmengen. Und XOR ist definitiv besser als ADD geeignet, um Bitmengen zu manipulieren." :-)
Update: Nur zum Spaß, bevor ich ins Bett gehe, hier ist eine "einzeilige" alternative Lösung, die keinen zusätzlichen Speicherplatz benötigt (nicht einmal einen Schleifenzähler), jedes Array-Element nur einmal berührt, zerstörungsfrei ist und überhaupt nicht skaliert: -)
printf("Answer : %d\n",
array[0] ^
array[1] ^
array[2] ^
array[999] ^
array[1000] ^
1 ^
2 ^
999^
1000
);
Beachten Sie, dass der Compiler zur Kompilierungszeit tatsächlich die zweite Hälfte dieses Ausdrucks berechnet, sodass der "Algorithmus" in genau 1002 Operationen ausgeführt wird.
Und wenn die Array-Elementwerte auch zur Kompilierungszeit bekannt sind, optimiert der Compiler die gesamte Anweisung auf eine Konstante. :-)
Ursprüngliche Lösung: Die nicht den strengen Anforderungen der Fragen entspricht, obwohl es funktioniert, um die richtige Antwort zu finden. Es verwendet eine zusätzliche Ganzzahl, um den Schleifenzähler beizubehalten, und greift dreimal auf jedes Array-Element zu - zweimal, um es bei der aktuellen Iteration zu lesen und zu schreiben, und einmal, um es für die nächste Iteration zu lesen.
Nun, Sie benötigen mindestens eine zusätzliche Variable (oder ein CPU-Register), um den Index des aktuellen Elements zu speichern, während Sie das Array durchlaufen.
Abgesehen davon gibt es hier einen destruktiven Algorithmus, der sicher für jedes N bis zu MAX_INT skaliert werden kann.
for (int i = 1; i < 1001; i++)
{
array[i] = array[i] ^ array[i-1] ^ i;
}
printf("Answer : %d\n", array[1000]);
Ich werde die Übung, herauszufinden, warum dies für Sie funktioniert, mit einem einfachen Hinweis verlassen :-):
a ^ a = 0
0 ^ a = a