【题目】
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
【题目分析】
注意异或运算的特点:即两个相同的数异或结果为0。也就是说,当一个整型数组里除了1个数字之外,其他的数字都出现了两次。这个时候把所有的数来异或操作,就能得到那一个只出现一次的数。那么扩展一下:一个整型数组里除了两个数字之外,其他的数字都出现了两次。找出这两个只出现一次的数字,只需要把数组分成2部分,每一部分中含有一个只出现一次的数,并且其他的数字都是成对出现的即可。分别疑惑后就可以得到结果。
【代码】
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int yihuo=0;
if(data.empty())return;
for(int i=0;i<data.size();i++)
{
yihuo^=data[i];
}
*num1=*num2=0;
int bits=first(yihuo);
for(int i=0;i<data.size();i++)
{
if((data[i]>>bits)&1)*num1^=data[i];
else *num2^=data[i];
}
}
int first(int yihuo)
{
int i=0;
while((yihuo&1)==0)//一定要注意优先级,当自己没把握idea时候要加上括号。
{
i++;
yihuo=yihuo>>1;
}
return i;
}
【个人总结】
1.思路上:这道题的重点就是异或
2.注意& 和==的优先级,当记不清优先级的时候:要么查一下优先级,要么就打括号,一定要记得!(==的优先级大于&的优先级)