日新刷题 - 645. 错误的集合

68 阅读1分钟

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

一、题目描述:

645. 错误的集合 - 力扣(LeetCode)

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 2 <= nums.length <= 10^4
  • 1 <= nums[i] <= 10^4

二、思路分析:

最简单的遍历解法,主要注意丢失数的查询,分为三种情况:

丢失的数为1(排序后的数组第一位不为1)
丢失的数为最后一个数(排序后的数组最后一位不为nums.length)
其他情况则定存在相邻两数差大于1
然后注意遍历时不要数组越界

三、AC 代码:

class Solution {
    public int[] findErrorNums(int[] nums) {
        // 先将数组排序
        Arrays.sort(nums);
        // 寻找丢失的数字
        int [] res = new int[2];
        // 如果缺的是1
        if (nums[0] != 1){
            res[1] = 1;
        }
        // 如果缺最后一个数
        if (nums[nums.length-1] != nums.length){
            res[1] = nums.length;
        }
        // 如果丢失的数字>1 <n 怎么一定存在相邻两数的差大于1
        for (int i = 0; i < nums.length-1; i++) {
            if (nums[i+1] - nums[i]>1){
                res[1] = nums[i] + 1;
            }
            // 找重复的数字,看有没有相邻的数
            if (nums[i] == nums[i+1]){
                res[0] = nums[i];
            }
        }
        return res;
    }
}

参考

LeetCode_645.错误的集合(菜鸟解法) - 错误的集合 - 力扣(LeetCode).

感觉看了答案都挺复杂的,也算是一种hash方法吧,自己想的...... - 错误的集合 - 力扣(LeetCode)

用数组表示每一位的状态 - 错误的集合 - 力扣(LeetCode)