题目
集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合丢失了一个数字并且有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4]
输出:[2,3]
示例 2:
输入:nums = [1,1]
输出:[1,2]
提示:
- 2 <= nums.length <= 104
- 1 <= nums[i] <= 104
解体思路
这是一道简单的题,但是我在评论中看到一种数学思想的解法,真的我太太太喜欢了,所以就把这道题写一下,来记录一下此刻的心情。
首先大家在看到示例之后脑海中肯定会想到取遍历整个数组,找到重复的数字,并且找到这个缺失的数组。
第一反应
先sort排序,这样重复的肯定在一起,又因为我们正确的数组的为 1 + 2 + 3 ... + n这样左右相差为1的整数数组,检查左右相邻的两个数字是否相差为1,就可以找到缺失的数字。
数学知识思路
首先如何计算1 + 2 + 3 + 4... + n 的和呢,n * (n + 1) / 2这样一个计算公式就可以计算出正确的数组的和
/**
* @param {number[]} nums
* @return {number[]}
*/
var findErrorNums = function(nums) {
// 首先计算出我们去重之后的和 例如: [1,2,2,4] 1 + 2 + 4 = 7
const S = [...new Set(nums)].reduce((pre,cur) => { return pre + cur});
// 然后找到我们错误数组的和 1 + 2 + 2 + 4 = 9
// 9 - 7 = 2 找到了我们的重复数字
// 然后用数学公式计算 n = 数组的长度 = 4 (1 + 2 + 3 + 4 = 10)(4 * (4 + 1)/ 2 = 10)
// 10 - 7 = 3 得到缺失的值
const sum = nums.reduce((pre,cur) => { return pre + cur });
return [(sum - S), (nums.length * (nums.length + 1) / 2) - S];
};
”本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情