A 异或 B的结果,代表了A和B在哪些位上是不一样的。那么我们可以随便找一个ret上为1的位,在这一位上,A和B是不同的。
那么我们可以根据这一位,讲数组分为两组,然后每一组,异或一遍,就可以得到所求的两个数了。
AC-Code
classSolution{public:voidFindNumsAppearOnce(vector<int> data,int* num1,int*num2){int len = data.size();if(len ==0)return;int ret =0;// A ^ Bfor(int i =0; i < len;++i)
ret ^= data[i];int low = ret &(-ret);*num1 =0,*num2 =0;for(int i =0; i < len;++i){if(low & data[i])*num1 ^= data[i];else*num2 ^= data[i];}return;}};