首页 > 编程语言 > 详细

LeetCode 面试题56 数组中数字的出现次数

时间:2020-04-28 23:10:40      阅读:66      评论:0      收藏:0      [点我收藏+]

这道题是给出你一个数组,只有两个数字出现一次,其余数字都是出现两次,要求空间O(1),时间O(n)。这道题的做法非常巧,我只想到了两个相同的数异或为0,然后把所有的数异或之后就得出目标两个数异或的结果,后面就不知道怎么才能在题目给出的时间和空间复杂度完成。我看了一个很好的方法,假设所有数的异或结果为10100,那么结果的两个数在从右往左数第三位不相同,我们就可以把数组中的数分为两组,一组是从右往左数第三位为0,一组是不为0,这两个只出现一次的数必然分别在这两组中,再分别求这两组中所有的数的异或结果,最终的结果就是两个只出现一次的数。

class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
        vector<int> ans;
        int sz=nums.size();
        int t=0;
        for(int i=0;i<sz;i++)
            t^=nums[i];
        int k=0;
        for(int i=0;;i++)
        {
            if((t&(1<<i))!=0)
            {
                k=1<<i;break;
            }
        }
        int t1=0,t2=0;
        for(int i=0;i<sz;i++)
        {
            if((nums[i]&k)!=0) t1^=nums[i];
            else t2^=nums[i];
        }
        ans.push_back(t1);
        ans.push_back(t2);
        return ans;
    }
};

LeetCode 面试题56 数组中数字的出现次数

原文:https://www.cnblogs.com/ambition-hhn/p/12797582.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!