class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2)
{
if(data.size()<2) //如果数组只有两个数,肯定就是这两个了
return ;
int size=data.size();
int temp=data[0];
for(int i=1;i<size;i++) //这里从第一个数开始做异或,因为相同的数异或之后会抵消掉,
//如001、001、100,3个数异或之后依然是100,所以我们可以根据这个特性,最后肯定会
//出现至少有一个1的情况,我们找到最低位的1,那两个不同的数肯定在这个位上不同,一个为1,一个为0
temp=temp^data[i];
if(temp==0)
return ;
int index=0;
while((temp&1)==0)
{
temp=temp>>1;
++index;
} //这里就是找到最低位的1
*num1=*num2=0;
for(int i=0;i<size;i++)
{
if(IsBit(data[i],index))//这里开始分了,如果在这个位上为0则到num1那去异或,否则去num2那里异或
*num1^=data[i]; //还是异或,你会发现最后相同的数异或都不见了,只剩下不同的数!!
else
*num2^=data[i];
}
}
bool IsBit(int num,int index)
{
num=num>>index; //这里的函数是判断该数在这个位上是不是1
return (num&1);
}
};