【LeetCode刷题】面试题 17.19. 消失的两个数字

1. 题目链接

面试题 17.19. 消失的两个数字

2. 题目描述

img

3. 解题方法

例子假设:

数组A元素为 :1 ,4,5

缺少的元素为:2, 3

那么所有整数就为1 ~ 5,我称这些整数为数组B

此时就有如下的图示:

img

第1步,此时将A、B两个数组的元素都异或起来,所得到的结果就是2 ^ 3,为了后面的讲解

我将2成为a,3称为b。

第2步,找到a和b(异或)比特位上为1的那一位

2 : 0 1 0

3 : 0 1 1

找到的这一位,我在这里叫做第x位

第3步,根据第x位的不同,划分两类进行异或求得结果

根据上面的例子

1 : 0 0 1

5 : 1 0 1

过程 : 3 ^ 1 ^ 1 ^ 5 ^ 5 (相同的两个数字异或直接为0,0异或任何数字为数字本身)

这一类划分到 3 这里进行异或,就得到了唯一的3

4 : 0 1 0

过程 : 2 ^ 4 ^ 4 (相同的两个数字异或直接为0,0异或任何数字为数字本身)

这一类划分到 2 这里进行异或,就得到了唯一的2

4. 代码

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) 
    {
        // 1. 把所有相同的数都异或起来, 获得a ^ b
        int tmp = 0;
        for(auto e : nums) tmp ^= e;
        for(int i = 1; i <= nums.size() + 2; i++) tmp ^= i;

        // 2. 找到a ^ b 比特位为 1 的那一位
        int diff = 0;
        while(1)
        {
            if((tmp >> diff) & 1 == 1) break;
            else diff ++;
        }

        // 3. 划分两类数字
        int a = 0, b = 0;
        for(auto e : nums)
        {
            if((e >> diff) & 1 == 1) a ^= e;
            else b ^= e;
        }
        for(int i = 1; i <= nums.size() + 2; i++)
        {
            if((i >> diff) & 1 == 1) a ^= i;
            else b ^= i;
        }
        return {a, b};
    }
};

最后附上我的打卡记录,希望各位大佬可以监督我。

img

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值