美文网首页
剑指offer 61- 数组中只出现一次的两个数字

剑指offer 61- 数组中只出现一次的两个数字

作者: 顾子豪 | 来源:发表于2021-06-05 10:44 被阅读0次

    一个整型数组里除了两个数字之外,其他的数字都出现了两次。

    请写程序找出这两个只出现一次的数字。

    你可以假设这两个数字一定存在。

    样例

    输入:[1,2,3,3,4,4]
    
    输出:[1,2]
    

    分析:

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

    两个相同的数异或得0
    两个不同的数(不为0)异或得1

    令这两个不同数分别为xy,异或的结果是s,则有S = x^yxy至少存在一位不同)
    S中第k位为1x的第k位为1y的第k位为0

    把nums中的所有数分成两大类,即第k位为1的所有数和第k位为0的所有数
    则有:
    k位为1的所有数中(记为集合S1),除了x之外,其余所有数都出现2次;
    k位为0的所有数中(记为集合S2),除了y之外,其余所有数都出现2次;

    集合S1中所有数异或,得到x
    然后y = S1^x
    x的所有数异或起来就得到xsy异或得到y

    class Solution {
    public:
    
        vector<int> findNumsAppearOnce(vector<int>& nums) {
            /*vector<int> res;
            unordered_map<int, int> hash;
            for(auto x:nums) hash[x]++;
            for(auto x:nums) {
                if(hash[x] == 1) res.push_back(x);
            }
            return res;*/
            int sum=0;
            for(auto x:nums) sum^=x;
            int k = 0;
            while(!(sum>>k & 1)) k++;
            int X=0;
            for(auto x:nums) 
                if(x>>k & 1) X^=x;
            return {X, sum^X};
        }
    };
    

    相关文章

      网友评论

          本文标题:剑指offer 61- 数组中只出现一次的两个数字

          本文链接:https://www.haomeiwen.com/subject/agdojltx.html