可以在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;}
};