题目描述
题目链接:
题目描述:
给定一个包含从 0 到 n 的整数数组,其中有两个数字缺失。请找出这两个缺失的数字。
题目示例:
输入:nums = [1,2] 输出:[3,4]
算法原理
解题思路
本题可以看作是'丢失的数字'与'只出现一次的数字 III'的组合题。
核心思路是将数组中的数和完整区间【1,n+2】内的所有数进行异或运算。问题转化为:有两个数出现了【一次】,其余所有的数出现了【两次】。进而变成了寻找两个只出现一次的数字的问题。
代码实现
方案一:位图划分
class Solution {
public:
vector<int> missingTwo(vector<int>& nums) {
// 将所有数异或在一起
int ret = 0;
for(auto x : nums) ret ^= x;
for(int i = 1; i <= nums.size() + 2; i++) ret ^= i;
// 找出 a,b 比特位不同的那一位
int differ = 0;
while(1) {
if(((ret >> differ) & 1) == 1) break;
else differ++;
}
// 根据 differ 位不同将所有数划分为两大类
int a = 0, b = 0;
for(auto x : nums) {
(((x >> differ) & ) == ) b ^= x;
a ^= x;
}
( i = ; i <= nums.() + ; i++) {
(((i >> differ) & ) == ) b ^= i;
a ^= i;
}
{a, b};
}
};


