集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。
给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入: nums = [1,2,2,4]
输出: [2,3]
我的做法是先将数组排序,然后遍历数组,找到相同的数字。相同的数字比较好找,重点是要找到缺失的那个数字。排序后相同的数字有三种存在形式,一种是排在前两个,一种是在中间,还有一种就是排在最后。
当相同的数字排在中间时:那么肯定会出现一个数减去前一个数等于 2,而却使得数就是这两个数中间的数。
当排在前两个时:如果后面的减去前面的(从第二个相同的开始)一直都是 1( 2 , 2, 3这种),说明缺的是 1,
如果减去出现2,那么就是缺 2 (1 ,1, 3 这种),没其他可能了
当排在最后两个时:这个和排在前两个时一样的,如果后面减去前面的出现了 2,说明缺的是数组长度减 1( 7,9,9),
如果没出现2,说明缺的是数组长度(7, 8,8)。
如果看完还觉得不是很清楚,那么就先来看代码。看完之后相信就明白了。
import java.util.*;
public class test0317 {
public static void main(String[] args) {
Solution S = new Solution();
int[] nums = new int[] { 1, 2, 2, 4};
int[] a = S.findErrorNums(nums);
for(int i : a) {
System.out.print(i + " ");
}
}
}
class Solution {
public int[] findErrorNums(int[] nums) {
Arrays.sort(nums);//先将数组从小到大排序
int[] a = new int[2];
int count = 0;
for( int i = 0; i < nums.length - 1; i++){
if(nums[i] - nums[i + 1] ==0){//找到相同的数字
a[0] = nums[i];
}
if( nums[i] - nums[i+1] == -2){
//如果相差为2,说明缺的是nums[i]与nums[i+1]之间的数
a[1] = nums[i] +1;
count ++;
}
}
if(count == 0 ){
//说明没出现相差为2的情况,那么只能是在前两个或者后两个。
if( nums[0] == 1){
a[1] = nums.length;
}else{
a[1] = 1;
}
}
return a;
}
}