题目描述:

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

异或的性质:

39、数组中只出现一次的数字_剑指offer

解题思路:

两个不相等的元素在位级表示上必定会有一位存在不同;

将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果

res&= -res得到出 res 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来

Demo:

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        int res = 0;
        for (auto num : data)
            res ^= num;
        // 将res最后一个不为1的位置设为1,其余位置设为0
        res &= -res;
        // 将数组分成两部分,就可以将这两个数分开
        for (auto num : data){
            if ((res & num) == 0)
                *num1 ^= num;
            else
                *num2 ^= num;
        }
        return;
    }
};