2016-04-22 5 views
3

Es ist ein Leetcode-Problem. Gegeben ein Array von Zahlen num, in denen genau zwei Elemente nur einmal vorkommen und alle anderen Elemente genau doppelt vorkommen. Finde die zwei Elemente, die nur einmal vorkommen.Bit-Operation UND

Zum Beispiel: Gegebene Zahlen = [1, 2, 1, 3, 2, 5], zurück [3, 5]. Mein Code ist:

class Solution { 
public: 
vector<int> singleNumber(vector<int>& nums) { 
int axorb=0; 
    for(auto i:nums) axorb=axorb^i; 
    int differbit=(axorb&(axorb-1))^axorb; 
    int group3=0, group5=0; 
    for(auto i:nums) 

if(differbit&i!=0) group5=group5^i;

 else group3=group3^i; 
     return vector<int>{group3,group5}; 

} 
}; 

Vorlage Ergebnis ist falsche Antwort.

Input:[0,0,1,2] 
Output:[3,0] 
Expected:[1,2] 

Aber wenn ich gerade markierten Teil

if(differbit&i) group5=group5^i; 

zu

ändern wird akzeptiert. Ich habe viel Zeit damit verbracht, darüber nachzudenken, habe aber immer noch keine Ahnung. Vielleicht ist eine Art Konvertierung passiert? Danke

Antwort

6

Dies hat mit Vorrang des Bedieners zu tun.
Weil in den frühen C die && and || Operatoren spät hinzugefügt wurden, wurde ihm eine sehr niedrige Priorität gegeben, so dass es die alten Programme nicht brechen würde.

Diese Stack overflow Question hat eine sehr gute Antwort, warum:

Von diesem Forum: http://bytes.com/topic/c/answers/167377-operator-precedence

Die & & und || Operatoren wurden später für ihr "Kurzschlussverhalten" hinzugefügt. Dennis Ritchie gibt rückblickend zu, dass der Vorrang der bitweisen Operatoren geändert werden sollte, als die logischen Operatoren hinzugefügt wurden. Aber mit einigen hundert Kilobyte Quellcode C in Existenz an diesem Punkt und einer installierten Basis von drei Computern, dachte Dennis, es wäre zu groß für eine Änderung in der Sprache C ...


Hier A Table zeigt die Rangfolge des Operators. enter image description here
Zeigt != mit einer höheren Priorität als &.

Wie Sie bitwise & niedriger als != auf dem Tisch sehen können, so was Ihr Code tut, ist die folgende:

if (differbit & (i!=0)) 

statt, was ich nehme an, Sie zu tun, meinte:

if ((differbit & i) != 0) 
Verwandte Themen