一个整数列,除了一个数字重复2次,所有其他数字都重复4次。O(n)时间O(1)空间找到那个只出现2次的。
e.g.
5, 6, 1123,5, 5, 6, 6, 7, 6, 7, 7, 1123, 5,7
输出 1123;
#include <iostream>
using namespace std;
unsigned int foo(unsigned int a[], int n)
{
unsignedint m[4] = {-1, 0, 0, 0}, mb;
for(int i = 0; i < n; i++)
{
mb= m[3];
m[3]= (m[3] & ~a[i]) | (m[2] & a[i]);
m[2]= (m[2] & ~a[i]) | (m[1] & a[i]);
m[1]= (m[1] & ~a[i]) | (m[0] & a[i]);
m[0]= (m[0] & ~a[i]) | (mb & a[i]);
}
returnm[2];
}
int main()
{
unsignedint test[] = {5,1,2,5,2,2,2,1,1,1,3,3,3,3};
unsignedint rt;
rt= foo(test, 14);
cout<< rt << endl;
return0;
}
所有数字的二进制第0位统计,0有多少个,1有多少个,比如1的个数是除4余2的,则得知要找的那个数的二进制第0位为1。其他二进制位同样。