(leetcode算法题)面试题 17.19. 消失的两个数字
可以在O(n)的时间复杂度下得到这两个消失的数字的异或的结果,或者得到这两个数字的和
但是怎么从上面的结果中得到这两个数字?
比如对于异或的结果,可以知道这两个数字在哪一位的置位是不同的
然后再根据这一位把 [1, n] 分为两个不同的数字集合 A 和 B,
也把 nums 分为两种不同的数字集合 C 和 D
然后A ^ C得到 消失的数字①,B ^ D 得到消失的数字②
下面以[1, 14]中消失了两个数字为例
代码如下
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;
}
};