数组中找出只出现一次的两个数字

问题:剑指 Offer 56 - I. 数组中数字出现的次数 - 力扣(LeetCode)

该问题巧妙地利用了异或运算的性质,两个相同的数字相异或为0,遍历完所有的数字后,只剩下两个不相同的数字的异或值,n = x^y;

再利用 n为1的首位,计算出这个值,将其遍历数组,进行 与运算,由其结果为0或1 ,得到两个数组;

对两个数组进行分别遍历异或,最后得到的值即为只出现一次的值

时间复杂度:O(N);空间复杂度:O(1);

class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
        int n = 0x0;
        for(auto num:nums){
            n ^= num;//遍历异或所有数字;
        }
        int m = 0x1;
        while((n & m) == 0){
            m <<= 1;//找到首位为1的位,此位代表两个数字值不相同的位
        }
        int x=0,y=0;
        for(auto num : nums){
            if(m & num) x ^= num;
            else y ^= num;
        }
        return vector<int> {x,y};

    }
};

 其中,找出首位为1的值m 可以简化代码为: 

m = n & (~n +1)

或者

m = n -(n & (n -1))

 

posted @ 2023-02-14 11:00  QianFa01  阅读(29)  评论(0)    收藏  举报