力扣 645. 错误的集合

题目说明

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

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

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

示例

示例 1:

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

示例 2:

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

笔者理解

此题是一道数组算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,笔者采用了朴素解法,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
/*
* 数组
* 排序
*/
public int[] findErrorNums(int[] nums) {
Arrays.sort(nums);
int n = nums.length;

// 重复的数字
int doubleNum = 0;
// 错误的数字
int errorNum = 0;
// 原来的所有数之和
int sum1 = 0;
// 错误集合的数之和
int sum2 = 0;

for (int i = n - 1; i >= 0; i--) {
if (i != 0 && nums[i] == nums[i - 1]) {
doubleNum = nums[i];
}
sum1 += (i + 1);
sum2 += nums[i];
}

// sum2 + errorNum = sum1 + doubleNum;
errorNum = sum1 + doubleNum - sum2;

return new int[] {doubleNum, errorNum};
}
}

时间效率一般,空间效率都还行,可见此解法还比较适合此题;

image.png

总结

本题是今天的每日一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。