一个数组所有的数都出现两次,有两个数只出现一次,求这两个数。
思路:
假设出现一次的两数为x,y;现将数组中所有数字异或得到结果xory = x^y;
找到xory中第一个为1的位置,记为mask,以这个mask是不是1为标准把原数组中的数字分成两个子数组,第一个子数组中每个数字的第mask位都为1,而第二个子数组的每个数字的第mask位都为0。x和y分别在不同的数组中。
然后数组内所有数字异或,即分别得出x,y。
void findTwoOdds(int a[],int n)
{
int xory =0;
for(int i=0;i<n;++i)
{
xory ^= a[i];
}
int mask = 1;
for(;(xory & mask)==0;mask<<=1);
int x=0,y=0;
for(int i=0;i<n;i++)
{
if(a[i] & mask)
x ^= a[i];
else
y ^= a[i];
}
}