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