http://blog.youkuaiyun.com/Dinosoft/article/details/6443354
一个全是32位整数的大数组,除了其中一个数字出现2次外,其余的数字都出现了3次。如何找出那个只出现了两次的数字?
一个全是32位整数的大数组,除了其中一个数字出现1次外,其余的数字都出现了3次。如何找出那个只出现了1次的数字?
考虑数组元素的某一个位,即bit
在这个位上,其他所有数字在这个位上1的数量是3的倍数
如果在这个位上,特殊值为0,则数组所有数字在这个位上的1的数量之和也是3的倍数
如果在这个位上,特殊值为1,则数组所有数字在这个位上的1的数量之和不是3的倍数
由此可以认为,每一个位上均是做三进制的运算,一旦为3,则这个位要清零
则,最后的数即要查找的数
用两个数组模拟三进制的加法,one表示低位,two表示高位,如果特殊值出现一次,返回one,出现两次,返回two
int special(int a[], int n) {
int one = 0;
int two = 0;
for (int i = 0; i < n; ++i) {
two |= one & a[i];
one ^= a[i];
int notThree = ~(one & two);
one &= notThree;
two &= notThree;
}
return two;
}