消失的“刷题”:找到所有数组中消失的数字 | 刷题打卡

317 阅读2分钟

如果把每天必须做的事情都列出来,做成一个 ToDoList , 估计除了吃饭、睡觉、带薪拉屎之外,其他的我可能一件都没法完成。为什么?我也尝试过分析原因,最后得出一个结论:你永远也别想叫醒一个装睡的人,同样,你无法拯救一个明明知道自己病入膏肓的人,而我就是这个人。依旧是每天浑浑噩噩,常常对着天花板发呆,让思绪僵住,似乎也是一种快乐……突然一个激灵,今天的题来了!

题目描述

分类困难度👍👎
算法简单 (63.68%)663-
标签 数组|
公司 google

给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。

找到所有在 [1, n] 范围之间没有出现在数组中的数字。

您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

示例 :

输入:
[4,3,2,7,8,2,3,1]

输出:
[5,6]

思路分析

首先想到的就是通过数组是否包含某个元素来判断,[1, n]数组中数组的长度为 n, 循环数组(1~n),理论上数组要包含1,2,3...n,也就是从 1 开始的索引值,因此如果索引值没在数组中就是没有出现的数字。

AC 代码

暴力解法

/*
 * @lc app=leetcode.cn id=448 lang=javascript
 *
 * [448] 找到所有数组中消失的数字
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findDisappearedNumbers = function(nums) {
    const arr = []
    for(let i = 1; i <= nums.length; i++) {
        if(!nums.includes(i)){
            arr.push(i)
        }
    }
    return arr
};
// @lc code=end

// 34/34 cases passed (8396 ms)
// Your runtime beats 14.88 % of javascript submissions
// Your memory usage beats 85.7 % of javascript submissions (45.7 MB)

另一种数组元素判断

其实就是第一种方法,先凑个数,好比我是胡乙己。

/*
 * @lc app=leetcode.cn id=448 lang=javascript
 *
 * [448] 找到所有数组中消失的数字
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findDisappearedNumbers = function(nums) {
    const arr = []
    for(let i = 1; i <= nums.length; i++) {
        if(nums.indexOf(i) === -1){
            arr.push(i)
        }
    }
    return arr
};

// 34/34 cases passed (8628 ms)
// Your runtime beats 7.89 % of javascript submissions
// Your memory usage beats 72.84 % of javascript submissions (45.8 MB)

有趣的是:

[NaN].indexOf(NaN) > -1 // false
[NaN].includes(NaN) // true
[,].indexOf(undefined) > -1 // false
[,].includes(undefined) // true

总结

今天就先到这,进阶的解法暂时没想到,一些概念也还在学习中。如果您能指点指点,欢迎留言鞭策!

本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情