欢迎访问我的blog http://www.codinglemon.cn/
面试题 17.04. 消失的数字
1. 题目描述
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例 1:
输入:[3,0,1]
输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
2. 解题代码
2.1 类暴力破解
我首先想到的方法是新创建一个boolean类型的数组tempArr,且数组长度为传入nums数组的长度再加1(因为nums数组缺了一个数),然后遍历nums数组,讲nums的每个元素的值作为tempArr数组的下标,修改该下标对应元素的值为true。遍历nums数组结束后,那么只会有缺失的那个数字作为tempArr的下标对应的元素的值为false,遍历tempArr,找出值为false的那个元素的下标,即为缺失的元素。
class Solution {
public int missingNumber(int[] nums) {
int numLength = nums.length;
boolean[] tempArr = new boolean[numLength+1];
for(int i =0;i< numLength;i++){
tempArr[nums[i]] = true;
}
for(int i=0;i< tempArr.length;i++){
if(!tempArr[i]){
return i;
}
}
return -1;
}
}
此时执行时间和占用内存为:
特别是对于内存消耗来说不是很理想,毕竟创建了临时数组。
2.2 求和再相减
既然整个数组中的元素都小于等于数组长度加1的值,那么定义临时变量sum,遍历nums数组,使得sum = sum + i - nums[i],这样遍历完nums数组后,sum的值即为缺失的那个值。代码如下:
class Solution {
public int missingNumber(int[] nums) {
int numLength = nums.length;
int sum = numLength;
for(int i =0;i< numLength;i++){
sum = sum + i-nums[i];
}
return sum;
}
}
执行时间和占用内存如下:
另外还有一种解法是用位运算,还未太理解…