leetcode 面试题17.19 消失的两个数字
一、题目描述
二、解题思路
整体思路
可以采用位运算的思想来解决这个问题。本题的思路是leetcode268丢失的数字与leetcode260只出现一次的数字III的汇总。
具体思路
(1)首先,将[1,n]与nums中的所有数字进行异或,由异或的运算律a^a=0可知,所有成对的数字会被消除,最终的结果为消失的两个数字a^b的结果;
(2)由于a和b不同,所以a^b一定不为0,即a^b一定至少存在一个比特位为1,将a^b的最右边的1分离出来(lowbit);
(3)然后将[1,n]和nums中的所有数依照该比特位是否为1进行分组异或,由于a^b不为0,所以a和b一定会被分开,其他的数字成对会消除,最终的a和b即为两个消失的数字,直接返回即可。
三、代码实现
时间复杂度:T(n)=O(n)
空间复杂度:S(n)=O(1)
class Solution {
public:vector<int> missingTwo(vector<int>& nums) {//求缺失两数的异或值int r=0;for(int i=1;i<=nums.size()+2;i++) r^=i;for(auto x:nums) r^=x;//分离出r最右边的1int tmp=r&(-r);//将[0,n]和nums中的数字进行分组异或int a=0,b=0;for(auto x:nums){if((x&tmp)==0) a^=x;else b^=x;}for(int i=1;i<=nums.size()+2;i++){if((i&tmp)==0) a^=i;else b^=i;}return {a,b};}
};