64、缺失数字

题目描述在这里插入图片描述

一开始撸出来的代码

class Solution {
    public int missingNumber(int[] nums) {
       Arrays.sort(nums);
        
       /// System.out.println(nums.toString());
        int i;
        for ( i = 0; i < nums.length-1; i++) {
			int j = nums[i];
			if(nums[i] + 1 != nums[i+1]){
				break;
			}
			
		}
          if(nums[0] == 1){
        	return 0;
        }
        return nums[i] + 1;  
    }
}

后续改进的代码,直接使用两个for循环,需要注意的是:第一个for循环是将s这个布尔数组进行初始化,因为默认是false,第二个for循环是找出s这个数组中的为false的下标,那么就返回这个下标

class Solution {
    public int missingNumber(int[] nums) {
        boolean s[] = new boolean[nums.length+1];
		for (int i = 0; i < nums.length; i++) {
			s[nums[i]] = true;
		}
		for (int i = 0; i < nums.length+1; i++) {
			boolean b = s[i];
			if(!b){
				return i;
			}
		}
		
		return 0;
    }
}

排名靠前的代码
好嘛,全部揉在一起了

class Solution {
    public int missingNumber(int[] nums) {
        int n = nums.length;
        int sum = 0;
        for(int i :nums)
            sum+=i;
        return (((int)Math.pow(n,2)+n)-2*sum)/2;
    }
}

这个代码直接进行异或
还是有点道理的,比如:只有0和2那么异或就是1,返回1即可,但是还要和0,1,2进行异或,这样才能找到,所以最后的是0-n(包括n)

class Solution {
    public int missingNumber(int[] nums) {
        //先求出n
		int n = nums.length;
		
		//将所给的序列的所有数以及[0,n]相互异或,余下的数就是只出现了一次的数
		//即没有出现在序列中的数
		int count = 0;
		for(int i=0;i<nums.length;i++){
			count ^= nums[i];
		}
		
		for(int i=0;i<=n;i++){
			count ^= i;
		}
		return count;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值