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;}};