645. 错误的集合『简单』

题目来源于力扣(LeetCode

一、题目

645. 错误的集合

题目相关标签:哈希表、数学

提示:

  • 给定数组的长度范围是 [2, 10000]。
  • 给定的数组是无序的。

二、解题思路

  1. 数组形式创建哈希映射,记录 nums 数组元素各出现的次数

  2. 遍历哈希数组,出现次数大于 1 的元素即重复的元素

  3. 出现次数等于 0 的元素即遗漏的元素

注意点:

  • 按题目要求:重复的元素在结果数组的索引 0 上,遗漏的元素在结果数组的索引 1 上

  • nums 数组中可能没有出现遗漏的元素(即出现次数等于 0 的元素),那么遗漏的元素就是最大的元素加 1,在代码中我们采用 bucket 数组长度加 1 的方式来简单地处理该情形

三、代码实现

public static int[] findErrorNums(int[] nums) {
    // 创建长度为 2 的数组,第一位用来存储重复的元素,第二位用来存储遗漏的元素
    int[] result = new int[2];
    // bucket 数组长度为 nums 数组长度加 1
    // 以防 {1, 1} 时,遗漏数字 2 不存在于数组中
    int[] bucket = new int[nums.length + 1];
    // 创建哈希映射
    for (int i : nums) {
        bucket[i] ++;
    }
    // 遍历 bucket 数组,找到重复项与遗漏项
    for (int i = 1; i < bucket.length; i++) {
        if (bucket[i] > 1) {
            // 重复的数字所在索引为 0
            result[0] = i;
        } else if (bucket[i] == 0) {
            // 遗漏的数字所在索引为 1
            result[1] = i;
        }
        // 提前结束循环
        if (result[0] > 0 && result[1] > 0) {
            return result;
        }
    }
    return result;
}

四、执行用时

五、部分测试用例

public static void main(String[] args) {
//    int[] nums = {1, 2, 2, 4};  // output:{2, 3}
//    int[] nums = {1, 1};  // output:{1, 2}
    int[] nums = {2, 2};  // output:{2, 1}
    int[] result = findErrorNums(nums);
    System.out.println(Arrays.toString(result));
}
posted @ 2020-05-15 21:24  知音12138  阅读(198)  评论(0编辑  收藏  举报