每日一题:645. 错误的集合

100 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

一、题目描述:

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

集合 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

二、思路分析:

算法思路:生成一个和原数组相同大小的数组,然后让这个辅助数组(按照顺序)保存原来数组各个元素出现的次数,这里举例来说明下。

nums = [1,2,2,4],辅助数组[0,0,0,0],并遍历nums
当访问第一个元素时候,辅助数组变成[1,0,0,0]
当访问第二个元素时候,辅助数组变成[1,1,0,1]
当访问第三个元素时候,辅助数组变成[1,2,0,0]
当访问最后一个元素,辅助数组变成了[1,2,0,1]
可见,我们只需要计算出这个数值为2的数字,即为重复的数字,那么数值为0的即为没有出现的数字

这个数字的计算:数字 = 索引值+1

三、AC 代码:

class Solution {
    public int[] findErrorNums(int[] nums) {
        Integer[] arr = new Integer[nums.length];
        Arrays.fill(arr, 0);
        for (int n : nums) arr[n-1]++;
        List<Integer> list = Arrays.asList(arr);
        return new int[]{list.indexOf(2) + 1, list.indexOf(0)+ 1};
    }
}

参考

错误集合——找数组中重复丢失元素类型题 - 错误的集合 - 力扣(LeetCode)

受【异或大法】的影响 遇到找重复、查缺失的题目 就这样思考了 - 错误的集合 - 力扣(LeetCode)