https://leetcode-cn.com/problems/set-mismatch/
描述
集合 S
包含从1到 n
的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。
给定一个数组 nums
代表了集合 S
发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入: nums = [1,2,2,4]
输出: [2,3]
注意:
- 给定数组的长度范围是 [2, 10000]。
- 给定的数组是无序的。
分析
最开始直接用indexOf和lastIndexOf做的,注意重复的和丢失的要分开处理,有顺序之分。
var findErrorNums = function(nums) {
let arr = []
for (let i = 1; i <= nums.length; i++) {
if (arr.length === 2) {
return arr
}
if (nums.indexOf(i) !== nums.lastIndexOf(i)) {
arr.unshift(i)
}
if (nums.indexOf(i) === -1) {
arr.push(i)
}
}
return arr
};
然而效率很低…
另一种方式是使用对象保存数组的值,先找出重复的,再判断在范围内找出丢失的。需要循环两次。
var findErrorNums = function(nums) {
let len = nums.length, obj = {}, lost, rep
for (let i = 0; i < len; i++) {
if (!obj[nums[i]]) {
obj[nums[i]] = true
} else {
rep = nums[i]
}
}
for (let i = 1; i <= len; i++) {
if (!obj[i]) {
lost = i
break
}
}
return [rep, lost]
};