64、缺失数字

题目描述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;
    }
}