https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/
异或xor性质:
交换律:A⊕B=B⊕A
结合律:A⊕(B⊕C)=(A⊕B)⊕C
恒等率:A⊕0=A
归零率:A⊕A=0
算法思想
先对所有数字进行一次异或,结果为两个只出现一次的数字的异或值。在异或结果中找到任意为1的位(此处找到异或结果中从右往左第一个1)。根据这一位对所有的数字进行分组,不同的两个数字位于不同组,相同的数字位于同一组。在每个组内进行异或操作,得到两个数字只出现一次的数字。
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
if(nums.size() < 2) return vector<int> ();
int myXor = 0;
for(auto val : nums) {
myXor ^= val;
}
int div = 1;
while((myXor & div) == 0) { //从右往左,寻找myXor第一个1出现的位置,下面将根据该值将数组分为两组,
div <<= 1; //不同的两个数字位于不同组,相同的数字位于同一组
}
int a = 0;
int b = 0;
for(auto val : nums) {
if((val & div) == 0)
a ^= val;
else
b ^= val;
}
return vector<int> {a, b};
}
};