数组中只出现一次的数字
class Solution { public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { int a=0; int index=0; vector<int> data1; vector<int> data2; //所有的数都按位异或,结果是a, for(int i=0;i<data.size();i++) { a=a^data[i]; } //取出a的最高位,依次与1取与,只有同为1,就可以判断出其位数 while((a&1)==0&&index<32) { a=a>>1;//自身右移,要赋值回来 index++; } //根据第一个1分组 for(int i=0;i<data.size();i++) { if(judge(index,data[i])) data1.push_back(data[i]); else data2.push_back(data[i]); } //分别遍历相异或得值 a=0; for(int i=0;i<data1.size();i++) { a=a^data1[i]; } *num1=a; a=0; for(int i=0;i<data2.size();i++) { a=a^data2[i]; } *num2=a; } int judge(int index,int a) { a=a>>index; if((a&1)==1)//相同 return 1; else return 0; } };
收货总结:
1.位运算,还有异或运算的加一步熟练,
2.与1按位相与,其实就是取数的二进制的低位。