文章目录
错误票据
某涉密单位下发了某种票据,并要在年终全部收回。
• 每张票据有唯一的ID号。
• 全年所有票据的ID是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务:
• 通过编程,找出断号的ID和重号的ID
假设断号不可能发生在最大和最小号。
要求程序:
• 首先输入一个整数(N<100)表示后面数据行数。
• 接着读入N行数据
• 每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于10000)
• 每个整数代表一个ID号。
• 程序输出1行,含两个整数mn,用空格分隔。其中,m表示断号ID,n表示重号ID
例如
用户输入:
2
5 6 8 11 9
10 12 9
则程序输出:
7 9
资源约定
峰值内存消耗(含虚拟机<64M);CPU消耗<2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入”的多余内容
public class Test05_错误票据 {
public static void main(String[] args) {
// 创建集合存储数据
ArrayList<Integer> list = new ArrayList<>();
// 控制台录入
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); // N 表示数据的行数
// 遍历N行数据
for (int i = 0; i < N; i++) {
String line = sc.nextLine();
String[] splits = line.split(" "); // 对每一行数据进行拆分
for (int j = 0; j < splits.length; j++) {
list.add(Integer.parseInt(splits[j])); // 将数据存入集合
}
}
System.out.println(list.size()); // 输出集合的大小
}
}
这里会报错:Exception in thread "main" java.lang.NumberFormatException: For input string: ""
,查了一下,说是在转成int数据类型的时候,空值不能实现。
在这里,个人理解是对于控制台内容的判断有误。这里的2
仅代表数据的行数N
,赋值后,对于遍历来说就只有控制行数遍历的作用。所以此时的控制台遍历内容实际上是后面两行,首先在遍历前就应该利用sc.nextLine()
下移一行,换句话说是吃掉2后面的换行符 \n
。
接下来就是对集合中的元素进行遍历判断 — 断点、重复ID:
package 蓝桥杯;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Scanner;
public class Test05_错误票据 {
public static void main(String[] args) {
// 创建集合存储数据
ArrayList<Integer> list = new ArrayList<>();
// 控制台录入
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
sc.nextLine(); // 更新控制台内容 --- 吃掉整数后面的换行符
// 遍历
for (int i = 0; i < N; i++) {
String line = sc.nextLine();
String[] splits = line.split(" ");
for (int j = 0; j < splits.length; j++) {
list.add(Integer.parseInt(splits[j]));
}
}
// 遍历集合判断断点、重复ID
// 1.首先进行排序
Collections.sort(list); // 对于集合的排序用Collections.sort()
// 2.遍历
int m = 0,n = 0; // 用于接收断点、重复值
for (int i = 1; i < list.size(); i++) {
if (list.get(i) - list.get(i-1) == 2){
m = list.get(i)-1;
}
if (list.get(i)==list.get(i-1)){
n = list.get(i);
}
}
System.out.println(m+" "+n);
}
}
测试: