侧边栏壁纸
博主头像
Hope博主等级

努力赚钱的工科研究生

  • 累计撰写 362 篇文章
  • 累计创建 129 个标签
  • 累计收到 5 条评论
标签搜索

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

Hope
2022-04-11 / 0 评论 / 0 点赞 / 421 阅读 / 456 字
温馨提示:
本文最后更新于 2022-04-11,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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

思路:

把所有的数都异或,最后得到的结果就是两个不同的数异或的结果,记为tmp。然后找个分组的条件,即tmp的中哪一位是1(只要找到一个就可以)记为第k位是1(这里指的是二进制的位),异或是不进位的加法,那么如果这一位是1,说明ab这一位是不同的,而对于其它的数字,由于都出现了两次而且重复的元素也意味着相等,所以不管怎么分组,相同的数字一定分到同一组,所以依据这个思想可以去寻找其中的一个数a,最后的答案就是{a,tmp ^ a}

代码:

class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
        int a  = 0;
        int tmp = 0;
        for(auto x : nums) tmp ^= x;
        int k = 0;
        while(!(tmp >> k & 1)) k++;
        for(auto x : nums){
            if(x >> k & 1) a ^= x;
        }
        return {a,tmp ^ a};
    }
};
0

评论区