day13

第一题

        

        题目讲解如图:

        本意是在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:本次的内容就到这里了,如果大家感兴趣的话就请一键三连哦!!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值