错误的集合(给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。)

集合 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;
          
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值