​题目传送门​


剑指Offer——JZ40.数组中只出现一次的数字【位运算】_数组


题解

  • 我们知道剑指Offer——JZ40.数组中只出现一次的数字【位运算】_数组_02^剑指Offer——JZ40.数组中只出现一次的数字【位运算】_数组_03
  • 那么把所有数都异或一遍,得到ret就是 A ^ B的值
  • A 异或 B的结果,代表了A和B在哪些位上是不一样的。那么我们可以随便找一个ret上为1的位,在这一位上,A和B是不同的。
  • 那么我们可以根据这一位,讲数组分为两组,然后每一组,异或一遍,就可以得到所求的两个数了。

AC-Code

class Solution {
public:
void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
int len = data.size();
if(len == 0) return;
int ret = 0; // A ^ B
for(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;
}
};