题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
题解:
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2)
{
int s = 0;
int n = data.size();
for(auto i:data)
s ^= i;
int k = s & (-s);
int k1=0,k2=0;
for(auto i:data)
{
if(i&k)
k1^=i;
else
k2 ^= i;
}
*num1 = k1;
*num2 = k2;
return;
}
};
解题思路:
先将数组中所有数异或遍历,得到只出现一次的两个数的异或;
得到的异或结果中,数值为1的哪一位肯定是两位中不同的。要找到这一位(并且这一位是第一个不同的位):
s & (-s)
然后通过这一位的不同,将数组分成两部分,进行异或,得到结果。