解题关键:s = a ^ b(a,b为两个不相同的数),s中位为1的说明a、b中只有一个该位为1,假设a该位为1,n中该位为1
的所有数肯定不包含b,s与n中该位为1的所有数进行异或即可得到a(相当于转换为只有一个数出现奇数次),b = s ^ a;
(1)s = n个数异或 = a ^ b
(2)找出s中某位为1的位k(s >> k && 1)
(3)a = s与n中所有右移k位为1的数异或
的所有数肯定不包含b,s与n中该位为1的所有数进行异或即可得到a(相当于转换为只有一个数出现奇数次),b = s ^ a;
(1)s = n个数异或 = a ^ b
(2)找出s中某位为1的位k(s >> k && 1)
(3)a = s与n中所有右移k位为1的数异或
(4)b=s^a;
主函数如下:
pair<int, int> findElement(const vector<int> &n)
{
int s = 0;
for(int i = 0; i < n.size(); i++)
s ^= n[i];
int k = 0;
while(!((s >> k) & 1))
{
k++;
}
int a = s;
for(int i = 0; i < n.size(); i++)
{
if(!((n[i] >> k) & 1))
continue;
a ^= n[i];
}
int b = s ^ a;
return pair<int, int>(a, b);
}