持续创作,加速成长!这是我参与「掘金日新计划 · 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)
}
}
};
运行结果如下图:
方法二
可以先把数组进行排序,这时候重复的数字一定是相邻的,那就好办了,只要找到重复的数字,再循环一遍找到不存在的数就可以了,代码如下:
/**
* @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]
}
}
}
}
}
运行结果如下:
总结
方法二中不使用map性能提升了不少,果然遇到数组的问题还是要记得先排序看看会不会发生神奇的情况,今天就忘记了。。。