(leetcode算法题)面试题 17.19. 消失的两个数字

可以在O(n)的时间复杂度下得到这两个消失的数字的异或的结果,或者得到这两个数字的和

但是怎么从上面的结果中得到这两个数字?

比如对于异或的结果,可以知道这两个数字在哪一位的置位是不同的

然后再根据这一位把 [1, n] 分为两个不同的数字集合 A 和 B,

也把 nums 分为两种不同的数字集合 C 和 D

然后A ^ C得到 消失的数字①,B ^ D 得到消失的数字②

下面以[1, 14]中消失了两个数字为例

代码如下

cpp 复制代码
class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int XORtotal = 0;
        for (auto& num : nums){
            XORtotal ^= num;
        }

        for (int i = 1; i <= nums.size() + 2; i++){
            XORtotal ^= i;
        }

        int judgeDigit = XORtotal & (-XORtotal);
        int XORtot1 = 0;
        int XORtot2 = 0;
        for (int i = 1; i <= nums.size() + 2; i++){
            if (judgeDigit & i){
                XORtot1 ^= i;
            }
            else{
                XORtot2 ^= i;
            }
        }

        for (auto& num : nums){
            if (judgeDigit & num){
                XORtot1 ^= num;
            }
            else{
                XORtot2 ^= num;
            }
        }
        vector<int> ret = { XORtot1, XORtot2 };
        return ret;
    }
};
相关推荐
2401_843785231 分钟前
C语言 扫雷程序设计
c语言·算法
qystca5 分钟前
炸弹 (boom.c)
算法
pen-ai8 分钟前
【LeetCode】4. 去重的效率提升
算法·leetcode·哈希算法
Tisfy9 分钟前
LeetCode 3019.按键变更的次数:遍历(转小写)
算法·leetcode·字符串·题解·遍历
无限码力19 分钟前
目标值子矩阵的数量
c++·算法·矩阵
ChoSeitaku39 分钟前
No.6十六届蓝桥杯备战|赋值操作符|连续赋值|复合赋值|类型转换|强制|混合|赋值(C++)
c++·算法·蓝桥杯
勤劳的进取家1 小时前
区别:支持向量机 (SVM) 和逻辑回归
算法·支持向量机·逻辑回归
萌の鱼1 小时前
leetcode 2279. 装满石头的背包的最大数量
数据结构·c++·算法·leetcode
S-X-S2 小时前
算法解析-经典150(图论、回溯法)
算法·深度优先·图论