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

来源:互联网 发布:淘宝代运营保销售 编辑:程序博客网 时间:2024/05/21 09:51

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

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

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

  • 如果一个序列所有的数均出现两次(偶数次),最终全部异或的结果会是 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];    }}
0 0
原创粉丝点击