题意:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:异或相同等于0,两数相同等于0;
这样可以得出两个数 的异或结果,这两个数一定不一样,那么在按位异或时一定会有等于1的情况,我们先找到一个出现1的位置,让其他数据针对这个位分组,再进行异或,消除相同数,得到结果
1 class Solution { 2 public: 3 void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { 4 int x=0; 5 for(int i=0;i<data.size();++i){ 6 x^=data[i]; 7 } 8 int f1=0,f2=0; 9 int len=0; 10 while(x%2==0){ 11 len++; 12 x=x>>1; 13 } 14 for(int i=0;i<data.size();++i){ 15 if((data[i]>>len)%2){ 16 f1=f1^data[i]; 17 }else{ 18 f2=f2^data[i]; 19 } 20 } 21 *num1=f1; 22 *num2=f2; 23 } 24 };