題目:
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;
}
}