题目链接
题目分析
这个题目我做过很多次,才完全通过了测试。
下面是我最开始的思路:
将第一次输入的考生信息存储到一个三维数组中,后来读入的查询信息读入到一个一维数组中,遍历一维数组并与三维数组中的对应信息比较,如果相等,就输出三维数组中的另外两列,如示例代码1所示。
但是这样做有一个测试点不能通过,原因是运行超时。后来我又将三维数组换成了HashMap<"试机号", "准考证号" + " " + "座位号">,如示例代码2所示。但是仍然是有一个测试点运行超时。
最后,没有办法,只能自己写结构,构造出一个考生类,然后将信息封装到考生对象里,并用这个考生的试机号作为相应的下标存储在数组当中才通过了所有测试。最终代码如示例3.
示例代码1
import java.util.Scanner;
public class L1_005 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//读入考生数
int num = sc.nextInt();
//读入换行符,防止下面读入错误
sc.nextLine();
//根据读入的 num 开辟一个 num 行、3 列的字符数组
String[][] arr = new String[num][3];
//num 次读入
for(int i = 0; i < num; i++) {
//每行 3 次读取,并将结果保存在数组当中
for(int j = 0; j < 3; j++) {
String s = sc.next();
arr[i][j] = s;
}
}
//读入迟到学生数
int number = sc.nextInt();
//用迟到学生数定义一个数组
String[] array = new String[number];
//数组里保存从控制台读入的试机座位号
for(int i = 0; i < number; i++) {
String s = sc.next();
array[i] = s;
}
sc.close();
//遍历保存试机座位号的数组
for(int i = 0; i < number; i++) {
String s = array[i];
//遍历保存考生信息的数组的第二列(试机号)
for(int k = 0; k < num; k++) {
if(s.equals(arr[k][1])) {
//匹配的情况下输出准考证号和考试座位号
System.out.println(arr[k][0] + " " + arr[k][2]);
}
}
}
}
}
示例代码2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public class L1_005 {
public static void main(String[] args) throws IOException {
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(inputStreamReader);
//读取输入的学生总数
int num_allStudent = Integer.parseInt(reader.readLine());
//创建一个HashMap用来存储数据 利用试机号作为键 准考证和座位号是对应的值
Map<String, String> map = new HashMap<String, String>();
//从键盘读取的每一行字符串
String str = null;
//拆分的字符串
String[] arr = new String[3];
for(int i = 0; i < num_allStudent; i++) {
//读入每一行的字符串
str = reader.readLine();
//分割字符串
arr = str.split(" ");
map.put(arr[1], arr[0] + " " + arr[2]);
}
//读取迟到学生的总数
int num_late = Integer.parseInt(reader.readLine());
//读取迟到学生的试机号
str = reader.readLine();
String[] arr_test = str.split(" ");
//通过试机号查询考生信息
for(int i = 0; i < num_late; i++) {
System.out.println(map.get(arr_test[i]));
//map.remove(arr_test[i]);
}
}
}
示例代码3
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class L1_005 {
public static void main(String[] args) {
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(inputStreamReader);
try {
//读取输入的学生总数
int num_allStudent = Integer.parseInt(reader.readLine());
// 从键盘读取的每一行字符串
String str = null;
// 用于保存字符串拆分结果的数组
String[] arr = new String[3];
//用于保存考生对象的数组
Student[] student = new Student[num_allStudent];
for (int i = 0; i < num_allStudent; i++) {
// 读入每一行的字符串
str = reader.readLine();
// 分割字符串
arr = str.split(" ");
//用考生的试机号-1 作为下标 数组中保存的考生对象里封装了学生的准考证号和座位号
student[Integer.parseInt(arr[1]) - 1] = new Student(arr[0], arr[2]);
}
// 读取迟到学生的总数
int num_late = Integer.parseInt(reader.readLine());
// 读取迟到学生的试机号并拆分成数组
str = reader.readLine();
String[] arr_test = str.split(" ");
// 通过试机号查询考生信息
int index = 0;
for (int i = 0; i < num_late; i++) {
index = Integer.parseInt(arr_test[i]) - 1;
System.out.println(student[index].getInfo());
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
//准考证号
private String numbers;
//考试座位号
private String num_exam;
public Student(String numbers, String num_exam) {
this.numbers = numbers;
this.num_exam = num_exam;
}
/**
*
* @Title: getInfo
* @Description: 返回考生准考证号以及考试座位号的组合字符串
* @return
*/
public StringBuilder getInfo() {
StringBuilder str = new StringBuilder(this.numbers);
str.append(" ");
str.append(num_exam);
return str;
}
}