本文主要是介绍缺席考试的是谁?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【问题描述】
程序设计考试结束了,传来个不好的消息:有一个学生没参加考试! 需要尽快知道缺席考试的人是谁,以便尽快做出处理。
糟糕的是,尽管有签到表,但由于人数较多,签到情况比较混乱:有的签到表签在一张白纸上,有的虽然签在名册上,但并不是签在自己姓名旁,更有学生签到了别的签到表上……
现在只能根据这签到表和名册上的2n-1个姓名(n个学生姓名在名册上,n-1个学生签到姓名),来找到缺席考试的人是谁,而且这2n-1个姓名没有什么顺序。唯一一个有利的条件是所有参加考试的人都签了名,且只签一次,签名也都正确无误。
现在任务交给你:编写一个程序,找出缺席考试的是谁。
【问题描述】
程序设计考试结束了,传来个不好的消息:有一个学生没参加考试! 需要尽快知道缺席考试的人是谁,以便尽快做出处理。
糟糕的是,尽管有签到表,但由于人数较多,签到情况比较混乱:有的签到表签在一张白纸上,有的虽然签在名册上,但并不是签在自己姓名旁,更有学生签到了别的签到表上……
现在只能根据这签到表和名册上的2n-1个姓名(n个学生姓名在名册上,n-1个学生签到姓名),来找到缺席考试的人是谁,而且这2n-1个姓名没有什么顺序。唯一一个有利的条件是所有参加考试的人都签了名,且只签一次,签名也都正确无误。
现在任务交给你:编写一个程序,找出缺席考试的是谁。
【输出形式】
对于每组测试数据,输出一行,只包含一个字符串,表示缺席的人的姓名。
【样例输入】
2张三李四张三0
【样例输出】
李四
【样例说明】
两个人,张三签到,缺席的显然是李四
解题思路
问题核心:找出唯一未签到的学生名字,考虑到每个学生除了未签到的那个外,其他人都恰好签到一次,所以我们可以通过计数或其他方式来识别出那个未签到的学生。
核心逻辑是利用HashMap
存储每个学生姓名出现的次数。由于题目条件保证了除了未签到的学生外,其他学生恰好签到一次,所以未签到的学生姓名在HashMap中对应的值将是唯一的奇数(因为签到表中有一个重复,导致计数为2,而未签到的学生计数为1)。通过这个特性,我们可以快速找到未签到的学生。
Java代码
import java.util.HashMap;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (true) {int n = scanner.nextInt(); //学生总人数if (n == 0) break;HashMap<String, Integer> student = new HashMap<>(); //HashMap:键是学生的姓名,值是该姓名出现的次数scanner.nextLine(); // 读取并丢弃nextInt()之后的换行符,以便正确读取下一行的字符串for (int i = 0; i < n * 2 - 1; i++) { // 循环读取2n-1个学生的姓名String name = scanner.nextLine();student.put(name, student.getOrDefault(name, 0) + 1); // 将姓名存入map中,如果map已经包含该姓名,则增加其计数;否则,将其计数设置为1}for (String key : student.keySet()) { // 遍历map中的每个条目,找到出现次数为奇数的姓名,即未签到的学生if (student.get(key) % 2 == 1) {System.out.println(key);break;}}}scanner.close();}
}
这篇关于缺席考试的是谁?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!