携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 8 天,点击查看活动详情
消失的数字
原题地址
数组 nums 包含从 0 到 n 的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n) 时间内完成吗?
注意:本题相对书上原题稍作改动
示例 1:
输入:[3,0,1]
输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
示例 3:
输入:[45,35,38,13,12,23,48,15,44,21,43,26,6,37,1,19,22,3,11,32,4,16,28,49,29,36,33,8,9,39,46,17,41,7,2,5,27,20,40,34,30,25,47,0,31,42,24,10,14]
输出:18
思路分析
方法一
- 通过题目可以先将数组进行排序,然后遍历数组来查看数组
第i项是否与i相同; - 若不相同,那么缺失的肯定是当前
i; - 写完后信心满满的提交代码,然后发现测试用例没有通过,没通过的第一个是
[0]输出的是undefined; - 看到特殊的示例才发现,有可能是最后一位缺失,因此在没有返回值时,返回
nums.length即可。
方法二
- 第一步依旧是给数组排序;
- 第二部在方法一种是我们自己循环来找到符合条件的值,那么可以使用数组的 API
findIndex方法,来找到缺失数字的下标,此时下标就是缺失的数字本身; - 按照方法一踩的坑,我们可以知道
findIndex会有返回-1的情况; - 因此需要做判断,若
index === -1则返回nums.length,否则返回index。
AC 代码
方法一
/**
* @param {number[]} nums
* @return {number}
*/
var missingNumber = function(nums) {
nums.sort((a, b) => a - b)
for(let i = 0; i < nums.length; i++) {
if(nums[i] !== i) {
return i
}
}
return nums.length
};
结果:
- 执行结果: 通过
- 执行用时:84 ms, 在所有 JavaScript 提交中击败了37.93%的用户
- 内存消耗:43.7 MB, 在所有 JavaScript 提交中击败了20.26%的用户
- 通过测试用例:122 / 122
方法二
/**
* @param {number[]} nums
* @return {number}
*/
var missingNumber = function(nums) {
nums.sort((a, b) => a - b)
const index = nums.findIndex((item, index) => item !== index)
return index === -1 ? nums.length : index
};
结果:
- 执行结果: 通过
- 执行用时:92 ms, 在所有 JavaScript 提交中击败了28.45%的用户
- 内存消耗:45.6 MB, 在所有 JavaScript 提交中击败了15.95%的用户
- 通过测试用例:122 / 122