题目描述
集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
-
示例 1:
输入:nums = [1,2,2,4]
输出:[2,3] -
示例 2:
输入:nums = [1,1]
输出:[1,2]
提示:
2 <= nums.length <= 104
1 <= nums[i] <= 104
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/set-mismatch
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
找重复数字的思路有两种:
思路一:HashSet。利用HashSet不重复的特性,找出重复的数字。
思路二:取相反数。当遍历到第 i 个数字时,将 nums[Math.abs(nums[i]) - 1] 取相反数,如果在取相反数前发现此数已为负数,则说明Math.abs(这个数)即为重复数字。
在找重复数字的同时,可以同步进行求出丢失数字和重复数字间的差。用等差数列求和公式减去原数组的和即可。
代码详解
思路一:HashSet
class Solution {
public int[] findErrorNums(int[] nums) {
int[] ans = new int[2];
int len =