第一题
题目讲解如图:
本意是在nums数组中和下面完整数组的元素中,找到原始数字nums中缺少的两个元素,我们可以转化思想,解题思路如下:
在一个完整数组和原始数组中,找到另个单独的元素,其余的元素都是成对的:
所以我们采用位运算的方式:
步骤一:
将两个数组的数全部异或到一起,最终的结果就是需要的两个数的异或假设最终所求的数为a和b,即当前所的到的结果为a^b;
步骤二:
我们当前的a和b肯定在比特位中存在一个位置,两个数在该位置上是不同的,一个为0,一个为1;所以我们要找到这个两个数比特位不同的最右那个位置,先定义为t位置;
步骤三:
将t位置根据等于0和等于1,把两个数组中的元素分为两类,一类是和a一样,在t位置上时1或0;一类是和b一样,在t位置上时0或1;
使用详细图解还原思路:
步骤一:得到a^b
步骤二:
根据上图找到最右边不同的比特位位置t=0;
所以t位置为1的所有数进行异或:
所以t位置为0的所有数进行异或:
故此得到a和b;
代码如下所示:
class Solution { public int[] missingTwo(int[] nums) { int temp = 0; for(int x : nums){ temp ^= x; } for(int i = 1 ; i<=nums.length +2;i++){ temp ^= i; } int dif = 0; while(true){ if(((temp >> dif) & 1) == 1){ break; }else{ dif++; } } int[] ret = new int[2]; for(int x : nums){ if(((x >> dif) & 1) == 1){ ret[1] ^= x; }else{ ret[0] ^= x; } } for(int i = 1 ; i<=nums.length +2;i++){ if(((i >> dif) & 1) == 1){ ret[1] ^= i; }else{ ret[0] ^= i; } } return ret; } }
ps:本次的内容就到这里了,如果大家感兴趣的话就请一键三连哦!!!