Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
class Solution {
public:
int singleNumber(int A[], int n) {
#if 0
int ans[32] = {0};
int res = 0;
for (int i = 0; i < 32; i++)
{
for (int j = 0; j < n; j++)
{
ans[i] += (A[j] >> i) & 1;
}
res |= (ans[i] % 3) << i;
}
return res;
#endif // 1
//一般解法,可以统计每个数字的每位bit的1的个数,最后的mod 3得到结果
#if 1
int one = 0, two = 0, three = 0;
for (int i = 0; i < n; i++)
{
two |= one & A[i];
one ^= A[i];
three = one & two;
one &= ~three;
two &= ~three;
}
return one;
#endif // 1
//one标记为当前数组成员为止,二进制中1出现1次,two标记二进制中1出现2次,
//three标记二进制中1出现3次,那么,当three = one & two,如果,某一个位
//one和two都有,那么,肯定是出现了三次,然后 ~three,则清除那些出现三次的数字
}
};