题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
这其实是除了有一个数字外,其它数字都出现两次的变种。只有一个数字不同的时候,可以采用异或来做。但此处是两个不同。书上给出的方法是先异或,得到结果值。然后在结果中,从右往左找到第一位是1的位号。由此考虑将数组分为两个数组。这样每个数组分别异或即可得到答案。
代码如下,其中要注意&的优先级小于"==",,注意加括号。
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int result=0;
int i;
for(i=0;i<data.size();i++)
{
result^=data[i];
}
*num1=0;
*num2=0;
int index;
index=FindFirstBitIs1(result);
for(i=0;i<data.size();i++)
{
if(is1(data[i],index))
*num1^=data[i];
else
*num2^=data[i];
}
}
int FindFirstBitIs1(int num)
{
int index=0;
while(((num&1)==0)&&(index<8*sizeof(int)))
{
num=num>>1;
index++;
}
return index;
}
bool is1(int num,int index)
{
num=num>>index;
return (num&1);
}
};