/* 40:> 数组中只出现一次的数(2个)(其他都出现2次) 时间:O(n),空间O(1) 异或 {2,4,3,6,3,2,5,5} 第一次异或 即4^6->0010 用0010把数组分成两部分{2,3,6,2,3},{4,5,5} */
int _res(int ar[], int len)
{
int res = 0;
for (int i = 0; i < len; ++i)
res ^= ar[i];
return res;
}
void FindOnlyAppearOnce(int ar[], int len, int* num1, int* num2)
{
if (ar == NULL || len < 2)
return;
int res = _res(ar,len);
int countBit = 0;
while ( (res & 0x1) == 0)
{
res >>= 1;
++countBit;
}
*num1 = 0;
*num2 = 0;
for (int i = 0; i < len; ++i)
{
int tmp = ar[i];
if ( ((tmp >>= countBit) & 1) == 1)
*num1 ^= ar[i];
else
*num2 ^= ar[i];
}
cout << *num1 << endl;
cout << *num2 << endl;
}
//void test()
//{
// int ar[8] = { 2,4,3,6,3,2,5,5 };
// int num1;
// int num2;
// FindOnlyAppearOnce(ar, 8,&num1,&num2);
//}