错误的集合 | 刷题打卡

158 阅读1分钟

题目

集合 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 = 数组的长度 = 41 + 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 春招闯关活动」, 点击查看 活动详情