http://www.jiuzhang.com/article/Google%202016%E5%B9%B412%E6%9C%88%20SDE%20Onsite%E9%9D%A2%E7%BB%8F/
http://www.lintcode.com/zh-cn/problem/find-the-missing-number/
http://www.jiuzhang.com/solutions/find-the-missing-number/
给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数。
样例
N = 4
且序列为 [0, 1, 3]
时,缺失的数为2
。
挑战
在数组上原地完成,使用O(1)的额外空间和O(N)的时间。
方法一:利用下标与值的关系,将和下标相同的值放到对应下标下,没有匹配下标的就是缺失值
方法二:利用数学特性
public class Solution {
/**
* @param nums: an array of integers
* @return: an integer
*/
public int findMissing(int[] nums) {
// write your code here
if(nums==null || nums.length==0) return -1;
//return find_by_exchange(nums);
return find_by_math(nums);
}
public int find_by_exchange(int[] nums){
int n = nums.length;
int i=0;
while(i<n){
while(nums[i]!=i && nums[i]<n){
int t=nums[i];
nums[i]=nums[t];
nums[t]=t;
}
i++;
}
for(int j=0; j<n; j++){
if(nums[j]!=j)
return j;
}
return n;
}
public int find_by_math(int[] nums){
int n = nums.length;
int sum=0;
for(int t:nums){
sum+=t;
}
return (0+n)*(n+1)/2-sum;
}
}