力扣 剑指offer 56-I 数组中数字出现的次数 异或位运算

1、先异或找到不同数字的的区别位

     然后相与分成2组

https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/solution/zong-he-guan-fang-jie-shi-he-ge-wei-da-lao-jie-shi/

力扣 剑指offer 56-I 数组中数字出现的次数 异或位运算_第1张图片

2、

class Solution {
public:
    vector singleNumbers(vector& nums) {
        int ret = 0;
        int a=0;int b = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            ret ^=nums[i];
        }
        int div =1;
        while((div & ret) == 0)
        {
            div <<= 1;
        }
        for(int i = 0; i < nums.size(); i++)
        {
            if(nums[i]&div)
            {
                a ^=nums[i];
            }else{
                b ^=nums[i];
            }
        }
        return vector{a,b};
    }
};

3、最开始用的map

力扣 剑指offer 56-I 数组中数字出现的次数 异或位运算_第2张图片

class Solution {
public:
    vector singleNumbers(vector& nums) {
        unordered_map mp;
        vector ans;
        for(auto a : nums)
        {
            mp[a]++;
        }
        for(auto c: mp)
        {
            if(c.second == 1)
            {
                ans.emplace_back(c.first);
            }
        }
        return ans;
    }
};

 

你可能感兴趣的:(#,二进制问题)