LeetCode645- 错误的集合 | 算法练习系列

126 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

前言

今天继续来一道简单的数组题目,统计数组中重复的项和缺失的项,乍一看好像很简单,但其中要注意的点还是不少的,要十分注意的点就是重复的项可能不在相邻的位置,我就是在这载坑了。

题目描述

集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。

给定一个数组 nums 代表了集合 S 发生错误后的结果。

请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

 

示例 1:

输入:nums = [1,2,2,4] 输出:[2,3] 示例 2:

输入:nums = [1,1] 输出:[1,2]

解题思路

本题的思路分为两部分

  • 找到缺少的项 至于缺少的项我这里是通过遍历和indexOf来判断缺少的项是几
  • 找到重复的项 至于重复的项我这里是通过for循环来遍历,同时用map来做记录,值做为map的键,如果不存在这个值就存入map,如果存在直接返回[重复的项(也就是当前的键),缺少的项]

代码如下:

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findErrorNums = function (nums) {
    let a = 0
    var map = new Map();
    for (let j = 0; j < nums.length; j++) {
        if (nums.indexOf(j + 1) === -1) {
            a = j + 1
        }
    }
    for (let i = 0; i < nums.length; i++) {

        if (map.get(nums[i])) {
            return [nums[i],a]
        } else {
            map.set(nums[i], true)
        }

    }
};

运行结果如下图:

image.png

方法二

可以先把数组进行排序,这时候重复的数字一定是相邻的,那就好办了,只要找到重复的数字,再循环一遍找到不存在的数就可以了,代码如下:

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findErrorNums = function (nums) {
    nums = nums.sort((a,b) =>a-b)
        let a = 0
        for (let i = 0; i < nums.length; i++) {
            if (a !== nums[i]) {
                a = nums[i]

            } else {
                for(let j=0;j<nums.length;j++){
                    if(nums.indexOf(j+1)===-1){
                         return [a, j+1]
                    }
                }
               
            }

        }
    }

运行结果如下:

image.png

总结

方法二中不使用map性能提升了不少,果然遇到数组的问题还是要记得先排序看看会不会发生神奇的情况,今天就忘记了。。。