每日一题-9/6-消失的数字

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

注意:本题相对书上原题稍作改动

示例 1:

输入:[3,0,1]
输出:2
 

示例 2:

输入:[9,6,4,2,3,5,7,0,1]
输出:8

分析:其实题目不难看懂,找一个缺失的数字

思路:1.最简单的思路:求和,1+2+...+n,然后减去输入的数字便能找到,消失的数字

如何通过代码来实现呢?

//求和
class Solution {
    public int missingNumber(int[] nums){
        int n = nums.length;

        int total = n*(n+1)/2;//数学公式求前n项的和
        int arrSum = 0;
        for(int i=0;i<n;i++)
        {
            arrSum+=nums[i];//数组内的求和
        }
        return total-arrSum; //两数相减   


    }
}

原理简单,方法易懂

2. 采用异或的方法,异或的原理其实很简单,二进制中相同为0,相异为1

首先让设定一个val,等于0^1^2^3^....^n

然后让val^整个输入数组,得到最后的ret便是消失的数字

代码实现

//异或
class Solution {
    public int missingNumber(int[] nums){
        int val = 0;
        for(int i = 0;i<nums.length+1;i++){
            val^=i;//异或0到n的所有数字
        }
        for(int i = 0;i<nums.length;i++){
            val^=nums[i];//异或整个数组
        }
        return val;
    }
}

3.空间的灵活使用,

我们把定义一个数组,数组有n个元素,每个元素为-1

 然后把输入数组的元素大小,放到我们定义数组的对应位置

我举一个例子:

示例 1:

输入:[3,0,1]

输入数组的元素3,放到我们定义数组的对应位置4上面,

输入数组的元素0,放到我们定义数组的对应位置1上面

输入数组的元素1,放到我们定义数组的对应位置2上面

这时候我们只要找出哪个元素是-1,便可得知哪个是消失的数字

代码展示:

//空间
class Solution {
    public int missingNumber(int[] nums){
        int[] ret= new int[nums.length+1];


       Arrays.fill(ret,-1);


       for(int i=0;i<nums.length;i++){
           ret[nums[i]]=nums[i];
       }
       for(int i=0;i<ret.length;i++){
           if(ret[i]==-1){
               return i;
           }
       }
       return -1;
    }   
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值