LeetCode 算法:消失的数字

178 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 8 天,点击查看活动详情

消失的数字

原题地址

数组 nums 包含从 0n 的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在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

思路分析

方法一

  1. 通过题目可以先将数组进行排序,然后遍历数组来查看数组 第i项 是否与 i 相同;
  2. 若不相同,那么缺失的肯定是当前 i
  3. 写完后信心满满的提交代码,然后发现测试用例没有通过,没通过的第一个是 [0] 输出的是 undefined
  4. 看到特殊的示例才发现,有可能是最后一位缺失,因此在没有返回值时,返回 nums.length 即可。

方法二

  1. 第一步依旧是给数组排序;
  2. 第二部在方法一种是我们自己循环来找到符合条件的值,那么可以使用数组的 API findIndex 方法,来找到缺失数字的下标,此时下标就是缺失的数字本身;
  3. 按照方法一踩的坑,我们可以知道 findIndex 会有返回 -1 的情况;
  4. 因此需要做判断,若 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

END