牛客网 数组中只出现一次的数字
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); } };