使用异或解题 —— 序列中仅出现一次的两个数

异或算法在算法求解中的妙用

(经典的异或技巧)数组中只出现一次的数字 (两种方法)

  • 如果一个序列除了某个数出现一次(奇数次)外,其他数均出现两次(偶数次),最终全部异或的结果会是这个出现一次(奇数次)的数;

  • 如果一个序列所有的数均出现两次(偶数次),最终全部异或的结果会是 0;

  • 如果一个序列除了某 2 个数出现一次(奇数次)外,其他数均出现两次(偶数次),最终全部异或的结果一定不为 0;

class Solution{
public:
    void FindNumsAppearOdds(vector<int> nums, int *num1, int *num2){
        if (nums.size() < 2) return;
        int myxor = accumulate(nums.begin(), nums.end(), 0, [](int x, int y) { return x^y; });
        int flag = 1;
        while ((myxor & flag) == 0) flag <<= 1;

        *num1 = myxor;
        *num2 = myxor;

        for (int i = 0; i < nums.size(); ++i)
            if (flag & nums[i]) *num1 ^= nums[i];
            else *num2 ^= nums[i];
    }
}