1. 程式人生 > >Single Number II的位操作解法

Single Number II的位操作解法

看了很多篇這個問題的位操作解法,感覺都是一句帶過,自己模擬了下才真正明白。

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就是出現一次的數