一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
思路:
所有的数异或,异或的结果中找出第一次出现1的位置 把数组分为两个部分,每个部分做异或,就可以出来了。这个出现1的位置是两个只出现一次的数的异或结果,现在要把这两个数分开。分成两个子数组,在做异或
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int yihuo=0;
for(int i=0;i<data.size();i++){
yihuo^=data[i];
}
unsigned int index=findfrist1(yihuo);
*num1=*num2=0;
for(int j=0;j<data.size();j++){
if(isbit1(data[j],index))
*num1^=data[j];
else
*num2^=data[j];
}
}
private:
unsigned int findfrist1(int num)
{
int flag=1;
unsigned int count=0;
while(((num&1)==0)&&(count<8*sizeof(int))){
num>>=1;
count++;
}
return count;
}
bool isbit1(int num, unsigned int indexbit )
{
num>>=indexbit;
return (num&1);
}
};