Single Number II的位操作解法
阿新 • • 發佈:2019-02-05
看了很多篇這個問題的位操作解法,感覺都是一句帶過,自己模擬了下才真正明白。
leetcode原題,大意就是一個數組只有一個數出現了一次,其他數都出現3次,設計演算法找出這個出現一次的數。
位操作解法如下,時間複雜度O(n)。
int singleNumber(int A[], int n) { int ones=0; int twos=0; int threes=0; for(int i=0;i<n;i++) { twos|=ones&A[i]; ones^=A[i]; threes=twos&ones; ones&=~threes; twos&=~threes; } return ones; }
其中ones表示將陣列中所有整形數轉為二進位制後,每個位上,1出現次數為1次的情況,如迴圈到某一步時,ones=00001001,即5時,表示前面的數中,第一位出現1的有個1個,第四位出現1的有一個。同理,twos表示某一位上出現1個次數為2。
這樣,就比較好理解當ones和twos中的某一位同時為1時表示二進位制1出現3次,此時需要清零。即用二進位制模擬三進位制計算,從而,當ones和twos某一位均為1時,threes對應的位置 置1,然後取反,和ones、twos、對應進行&操作,將其清零。最後,得到的ones就是出現一次的數