Update 2: Manche Leute denken, dass die Verwendung von XOR zum Auffinden der doppelten Zahl ein Hack oder Trick ist. Meine offizielle Antwort darauf lautet: "Ich suche nicht nach einer doppelten Zahl, sondern nach einem doppelten Muster in einer Reihe von Bitmengen. Und XOR ist definitiv besser geeignet als ADD, um Bitsätze zu manipulieren" :-)
Aktualisierung: Nur zum Spaß, bevor ich ins Bett gehe, hier eine "einzeilige" Alternativlösung, die keinen zusätzlichen Speicherplatz benötigt (nicht einmal einen Schleifenzähler), jedes Array-Element nur einmal berührt, nicht destruktiv ist und überhaupt nicht skaliert :-)
printf("Answer : %d\n",
array[0] ^
array[1] ^
array[2] ^
// continue typing...
array[999] ^
array[1000] ^
1 ^
2 ^
// continue typing...
999^
1000
);
Beachten Sie, dass der Compiler die zweite Hälfte dieses Ausdrucks zur Kompilierzeit berechnet, so dass der "Algorithmus" in genau 1002 Operationen ausgeführt wird.
Und wenn die Werte der Array-Elemente auch zur Kompilierzeit bekannt sind, optimiert der Compiler die gesamte Anweisung auf eine Konstante :-)
Originelle Lösung: Das entspricht nicht den strengen Anforderungen der Fragen, auch wenn es funktioniert, um die richtige Antwort zu finden. Es verwendet eine zusätzliche Ganzzahl, um den Schleifenzähler zu halten, und es greift auf jedes Array-Element dreimal 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.
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 einen destruktiven Algorithmus, der sicher für jedes N bis zu MAX_INT skalieren kann.
for (int i = 1; i < 1001; i++)
{
array[i] = array[i] ^ array[i-1] ^ i;
}
printf("Answer : %d\n", array[1000]);
Ich überlasse es Ihnen, herauszufinden, warum das funktioniert, und gebe Ihnen einen einfachen Tipp :-):
a ^ a = 0
0 ^ a = a