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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章