持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
一、题目描述:
集合 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).