2016-11-26 10 views
1

Ich arbeite an diesem Problem. "Gegeben ein Array, finde den Int, der eine ungerade Anzahl von Malen erscheint. Es wird immer nur eine ganze Zahl geben, die eine ungerade Anzahl von Malen erscheint." Ich kam mit dieser Lösung Online-up:Ich verstehe nicht, was passiert mit dieser XOR

function findOdd(A) { 
var n = 0; 
    for(var i = 0; i < A.length; i++){ 
    n = n^A[i]; 
    } 

    return n; 
} 

Dies funktioniert, aber ich bin nicht sicher, warum, und ich habe gehofft, dass es mir jemand erklären könnte. Ich verstehe nur nicht die Zeile:

Könnten Sie mir bitte sagen, was es in diesem Fall tut?

+1

Fragen Sie, was XOR tut? Was genau ist der Inhalt von 'A'? – Taplar

Antwort

2

Wenn Sie eine beliebige Zahl mit sich selbst übernehmen, ergibt das 0. Wenn Sie wissen, dass nur eine Zahl ungerade erscheint, werden die anderen durch Selbstverzerrung gelöscht, und die Antwort ist die verbleibende Zahl erscheint eine ungerade Anzahl von Malen.

+1

Dies sollte als die Antwort markiert werden – Gravity

+1

Und xoring 0 mit einem int ist das Int. Und xor ist assoziativ und kommutativ. QED. – Oriol

0

^ist ein exor Bit-Operator. so, wenn Sie tun

  • 1^1 ist 0

  • 0^1 ist 1

  • 1^0 ist 1
  • 0^0 ist 0

so Um die ungerade Anzahl von 1 zu finden ist der folgende Code ist zunächst Ergebnis ist arr [0] ist 1. so im arrary 0^0 zu 0 und 2^2 0 wird, und es gibt 3 1'en so 1^1 bekommt 0 und mit 0^1 wir mit der Nummer leftout sind, die ungerade nubmer Mal wiederholt

var arr=[1,1,1,0,0,2,2]; 
 
var result=arr[0]; 
 
for(var i=1;i<arr.length;i++) 
 
    result=result^arr[i]; 
 

 
console.log(result); 
 

Hoffe, dass es

0

XOR von zwei gleichen Zahlen hilft immer Null ist. Das heißt,

A^A=0

Also, wenn Sie eine bestimmte Anzahl mit sich selbst gerade Anzahl von Malen wiederholt XOR, wird das Ergebnis gleich Null sein.

Hier ist zunächst der Wert von n gleich Null. Die Zahl, die gerade einmal XOR-ediert wird, ergibt null. Und die Anzahl, die ungerade Anzahl von Malen ist, sagen 2m+1 Anzahl Male, wird zu Null für 2m Auftreten führen, und dieselbe Nummer für das letzte Auftreten.

So funktioniert diese Lösung.

1

Bitweise Operatoren arbeiten mit 32-Bit-Zahlen. Jeder numerische Operand in der Operation wird in eine 32-Bit-Zahl umgewandelt. Das Ergebnis wird zurück in eine JavaScript-Nummer konvertiert. ^ ist ein bitweiser XOR-Javascript-Operator.

Der bitweise XOR-Operator gibt an jeder Bitposition eine Eins zurück, für die die entsprechenden Bits eines der beiden Operanden, nicht aber beide Operanden, sind.

Ein XOR b ergibt 1, wenn a und b verschieden sind. Die Wahrheitstabelle für die XOR-Operation ist:

a b  a XOR b 

0 0   0 
0 1   1 
1 0   1 
1 1   0 

Erklärung für die Expression n = n^A[i];

A = [1,2,3,4,5] lassen

für n=0, i=0 =>0^A[0] =>0^1 => zu 0001 in binären 0000^0001 Ergebnisse umgesetzt, die gleich ist zu 1

für n=1, i=1 =>=>1^1 => umgewandelt in binäre 1111^0010 Ergebnisse 1101, die 13

und so weiter gleich ... Hoffe diese Lösung hilft Ihnen, den obigen Ausdruck zu verstehen und Ihre alle Zweifel beseitigen.