一、题目

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

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

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

点击查看原题
难度级别: 简单

二、思路

1)排序+遍历

由于1n的整数范围内,只缺失一个数,且随机重复一个数字,那只需将其排序
遍历该数组,对比相邻两个元素,可以找到重复的那个数字;当发现下标loc与元素nums[loc]不满足关系nums[i] = pre + 1pre+1为缺失的那个数字

三、代码

1)排序+遍历

  1. class Solution {
  2. public int[] findErrorNums(int[] nums) {
  3. Arrays.sort(nums);
  4. int absent = nums.length, repeat = 0;
  5. int loc = 0;
  6. int pre = 0;
  7. for (int i = 0; i < nums.length; i++) {
  8. if (nums[i] == pre) {
  9. repeat = nums[i];
  10. } else if (nums[i] - pre != 1) {
  11. absent = pre + 1;
  12. }
  13. pre = nums[i];
  14. }
  15. return new int[]{repeat, absent};
  16. }
  17. }

时间复杂度为O(nlogn),空间复杂度为O(1)