Java数组(算法268):缺失数字

题目:

给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
题目

题目分析:

  1. 要点:
    注意题目中的0~n的数组,可得->遍历时仅需从零遍历到nums.length即可,无需遍历寻找最大最小值
  2. 对所给的数组进行查找,找到0~n中没有出现的那个数字并进行输出

题目解答:

  1. 方法一(依次遍历进行查找):
    a. 建立两个for循环
    b. 依次进行0~n与每个数组进行比较
    若遍历结束还没有找到相匹配的值,则输出该数字,该数字便为缺失的数字
    若找到,则进行下一个数字的比较

  2. 方法二(运用数学):
    a. 将数组中的数字相加
    b. 与0~n的总和进行比较相减
    c. 相减得到的数字就是所缺失的数字

  3. 方法三(运用异或,位运算)
    规则:
    交换律:a ^ b ^ c <=> a ^ c ^ b
    任何数于0异或为任何数 0 ^ n => n
    相同的数异或为0: n ^ n => 0

    a. 0^4=4 ; 4^4=0
    b. 将数组中所有的数字和0~n进行异或

代码实现:

  1. 方法一(遍历):
        //遍历判断,找出0~n中没有的那个数字
        for(int a=0;a<nums.length;a++){
            boolean flag=false;			//定义一个指标,用来判断是否为正常结束for循环退出
            for(int i=0;i<nums.length;i++){
                if(a==nums[i]){
                    flag=true;
                    break;				//如果相等的话,不用考虑节后的数字,直接进行退出
                }
            }
            if(!flag){
                return a;
            }            
        }
        return nums.length;				//防止出现缺失的数字是最后个数字时的情况
  1. 方法二(运用数学 —相加相减):
        //将所有数字加起来,减去0~n即可得出缺失的数字
        int sum=0;
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
        }
        return nums.length*(nums.length+1)/2-sum;	//运用数学思维计算总和,返回相减的值
  1. 方法三(异或—位运算):
//异或 运用位运算
        int res=nums.length;
        for(int i=0;i<nums.length;i++){
            res^=nums[i]^i;		//将所有的数组中所有的数字和0~n异或起来
        }
        return res;

代码总结:

  1. 方法一:所占用的空间较大,且代码相比其他的方法过多,不推荐使用;
  2. 方法二:运用数学思维,简化了代码,是运算该种类型的题的简便技巧;
  3. 方法三:异或——>与136“只出现一次数字”思路较像,推荐。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值