問題:找出只出現一次的數,其他數出現了三次
分析:將數轉化為二進制的位,數出現了三次相當於其對應的二進制上每個位置出現了3次,這里有個抽象的地方就是,例如數中包含1,3兩個其二進制的第一位都包含1,
怎么區分,其實並不需要區分,無論是數字3的還是數字1的二進制第一位的1都無所謂,因為我們完全可以將其認為總共是6次,無論先用的數字3的還是用的數字1的,
都能將該位置湊夠兩組重復了3次的1
class Solution {
public:
int singleNumber(int A[], int n) {
int one,two,three;
one=two=three=0;
for(int i=0;i<n;i++)
{//一定是出現3次,2次,1次這樣的順序,如果反過來的話,先更新了one的話,會影響到two和three的
three = two & A[i];//已經出現了兩次,還出現了一次
two = two | one & A[i];//出現了1次又出現了1次,在加上以前已經出現了2次的,為新的出現了2次的
one = one | A[i];//出現了1次
//將出現3次的其出現1次2次全部抹去
one = one & ~three;
two = two & ~three;
}
return one;
}
};
