LeetCode - 268. Missing Number

题目:

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.


思路与步骤:

思路1:

排序,然后将数组与下标比较,第一次出现不相等的下标即确实数据。

学习别人的思路:

思路2:

先对0到n求和,然后用这个和依次减去数组中的数字,最后得到的值就是缺失值。(这个思路很赞啊!

思路3:

用到位抑或,由于 a^b^b 等于 a,所以用将所有的下标值和数组值抑或(后文简称抑或结果)。

如果缺失值就是 n,则抑或结果为 0;如果缺失值不是 n,则数组中一定存在 n, 于是抑或结果就是 n^缺失值 i ,由于 n 的所有位上都是1,所以抑或结果就是 i 取反。

存储抑或值的变量 xor 的初始化有两种,第一种是 初始化为 0 , 第二种是 n。初始化之后

xor = xor ^ i ^ nums[i];

具体分析如下:

  缺失值为 n 缺失值不为 n 返回值
所有的下标值和数组值抑或(抑或结果) 0 缺失值取反  
xor 初始化为 0(不影响抑或结果) xor 为 0 xor 为缺失值取反 xor ^ n
xor 初始化为 n(xor值为抑或结果取反) xor 为 n xor 为缺失值 xor

编程实现:

Solution-1

public class Solution {
    public int missingNumber(int[] nums) {
        // sort
        Arrays.sort(nums);
        int i = 0;
        while(i<nums.length && nums[i]==i)  i++;
        return i;
    }
}

Solution-2

public class Solution {
    public int missingNumber(int[] nums) {
        // sum
        int len = nums.length;
        int sum = (0+len)*(len+1)/2;
        for(int i=0; i<len; i++)    sum-=nums[i];
        return sum;
    }
}

Solution-3-1

public class Solution {
    public int missingNumber(int[] nums) {
        // XOR-1
        int xor = nums.length, i = 0;
	for ( ; i < nums.length; i++)   xor = xor ^ i ^ nums[i];
	return xor;
    }
}

Solution-3-2

public class Solution {
    public int missingNumber(int[] nums) {
        // XOR-2
	int xor = 0, i = 0;
	for ( ; i < nums.length; i++)   xor = xor ^ i ^ nums[i];
	return xor ^ nums.length;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章