蓝桥杯:错误票据

分析:


        首先拿数据,因为是三行的数据,所以我选择每次拿一行,拿到的一行为字符串类型,然后以空格为标识符,拿到数据。

第一行只需要拿到一个N,用来做输入的循环,如:for(int i = 0;i<N;i++),这样拿到接下来N行的数据

之后每一行拿到数据,都对空格进行切割,拿到数字的数组。

之后遍历拿到这一行的数字数组,遍历,同时创建一个最大值和最小值(因为题目的ID号是连续的,且断号就是最小值到最大值之间缺少的数字,重复号就是得到数据里面出现次数为2的数字)

我在使用一个Set对得到的数据进行去重,因为如果我得到的数据往Set里面添加,如果添加成功了,代表这个数据当前是第一次出现(第一次添加到Set),如果添加失败(出现了第二次,就会添加失败),那么这个数就是重复号,我们记录下来。每对一个数据进行添加到Set里面,也要拿它和最大值,最小值进行比较,更新拿到数据里面的最大值和最小值,然后遍历一遍最小值-最大值for(int i = min;i<=max;i++),找到断号即可(因为使用Set进行判断,我们从最小值开始往Set放数据,因为我们之前拿数据的时候往Set里面放过数据,所以如果出现过的数据,就已经添加到Set里面了,我们在这次遍历的时候,添加数据肯定很多次都是失败,只有我们在拿数据的时候没有的数据,才能添加成功,所以我们在添加成功后,记录下来这个数,这个数就是断号)。


Java: 

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //因为是三行,所以不能用next,得用nextLine来实现换行的操作
        int N = Integer.valueOf(scan.nextLine());
        List<Integer> list = new ArrayList<>();
        Set<Integer> set = new HashSet<>();
        //在拿数据的时候,同时把得到的数据放到Set去重,如果出现重复的,那么就是重复号n
        //然后依次从列表的最小值到最大值进行遍历,往set里面添加数据,如果添加成功了,
        //那就代表这个数据是set里面没有的(也就是输入的时候没有的),这个就是断号m
        int max = 0;
        int min = 0;
        //断号和重复号
        int m = 0;
        int n = 0;
        for(int i = 0;i<N;i++){
            String s = scan.nextLine();
            for(String str : s.split(" ")){
                //将拿到的字符串以空格为标识符进行切割,切割成只有数字的字符串数组
                //在转换成int类型,添加到list里面

                int number = Integer.valueOf(str);
                list.add(number);
                //拿最大最小值
                if(number>max){
                    max = number;
                }
                if(number<min){
                    min = number;
                }
                //添加到set去重
                //如果能成功添加,代表不是重复的数字,也就不是重复号
                if(!set.add(number)){
                    n = number;
                }
            }
        }
        //拿完数据,我们也从最小值开始遍历到最大值,往set添加数据,如果添加成功了,代表我们之前拿到的数据没有这个数
        //那么这个数就是断号m
        for(int i = min;i<=max;i++){
            //如果添加成功,就记录m
            if(set.add(i)){
                m = i;
            }
        }
        System.out.println(m+" "+n);
        scan.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值