跳转至

56.1.数组中数字出现的次数 (Medium)*

题目描述*

思路 & 代码*

要找两个只出现了一次的数字。一个的话很好找,异或就行。两个就不太懂了。。。肯定不能一次遍历就找到。

首先一次遍历,全体异或,得到要求两个值的异或和。然后我们取一个掩码 1 << x,只要异或和的 x 位为 1 即可。

class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
        int res = 0 ;
        for(auto& num : nums) {
            res ^= num;
        }
        int mask = res & (-res);
        int a = 0, b = 0;
        for(auto& num : nums) {
            if(mask & num) {
                a ^= num;
            }else {
                b ^= num;
            }
        }
        return {a, b};
    }
};

最后更新: July 23, 2022