题目来源于力扣(LeetCode)
一、题目
题目相关标签:哈希表、数学
提示:
- 给定数组的长度范围是 [2, 10000]。
- 给定的数组是无序的。
二、解题思路
-
数组形式创建哈希映射,记录 nums 数组元素各出现的次数
-
遍历哈希数组,出现次数大于 1 的元素即重复的元素
-
出现次数等于 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));
}