0
点赞
收藏
分享

微信扫一扫

LeetCode 剑指 Offer 56 - I. 数组中数字出现的次数***

老榆 2022-04-18 阅读 66
leetcode

具体思路:

很牛皮的一种思路;

目前见到这种类似找不同的题目,大概就这几个思路:
1.原地哈希;
2.利用数值范围进行hash辅助;
3.位运算;

采用异或思想,对于所以出现两次异或的数,最后全体异或的结果必定是0;

如果其中有指出现一次的a,b两个数,则结果是a^b;

但是对于a^b来说,必定位中至少有一位是1,代表a,b在该位不同;

此时按照该位进行全元素分桶,a,b必定落在不同的桶,每个桶的剩余元素必定成对出现;

此时两个桶分别得异或结果必定是a和b;

具体代码:

class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
        int temp=0;
        for(auto& n:nums)
            temp^=n;
        int div=1;
        while((div&temp)==0){
            div=div<<1;
        }
        int a=0;
        int b=0;
        for(auto& n:nums){
            if((div&n)){
                a^=n;
            }else{
                b^=n;
            }
        }
        return {a,b};
    }
};
举报

相关推荐

0 条评论