您的位置:首页 > 其它

268. Missing Number

2018-03-16 21:59 176 查看
一、题意

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

Example 1

Input: [3,0,1]

Output: 2

Example 2

Input: [9,6,4,2,3,5,7,0,1]

Output: 8

Note:

Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?

二、分析和解答

题意要求在一个线性时间内完成,并且使用常数个额外的空间。

这个题和那个找到第一个字符串中不唯一的字符相似。凡是有限个长度的数组都可以考虑这种桶排序或者计数排序的东东。

1、

public int missingNumber(int[] nums) {
int result = -1;
int[] arr = new int[nums.length + 1];
for(int i=0;i<nums.length;i++){
arr[nums[i]]++;
}
for(int i=0;i<arr.length;i++){
if(arr[i] == 0){
result = i;
break;
}
}
return result;
}


2、别人的算法

等差数列的和减去目前数组中所有值的和即是所求!

public int missingNumber(int[] nums) {
int sum = 0;
for(int i=0;i<nums.length;i++){
sum += nums[i];
}

return (0 + nums.length + 1) * (nums.length) / 2 - sum;
}


等差数列求和公式:Sn=n(a1+an)/2

一看即知!

3、还有个位运算,使用异或操作。使用数组和0-n进行异或,只有漏掉的那个数是单独的(还是本身),剩下的都会是成对的(为0),结果即为所求。

异或:

a ^ 0 = 0 ^ a = a;

a ^ b = b ^ a ;

a ^ a = 0;

public int missingNumber(int[] nums) {
int res = 0;
for(int i=0;i<nums.length;i++){
res = res ^ nums[i] ^ i;
}
res = res ^ nums.length;
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: