分析:
首先拿数据,因为是三行的数据,所以我选择每次拿一行,拿到的一行为字符串类型,然后以空格为标识符,拿到数据。
第一行只需要拿到一个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();
}
}