缺席考试的是谁?

【问题描述】

  程序设计考试结束了,传来个不好的消息:有一个学生没参加考试! 需要尽快知道缺席考试的人是谁,以便尽快做出处理。

  糟糕的是,尽管有签到表,但由于人数较多,签到情况比较混乱:有的签到表签在一张白纸上,有的虽然签在名册上,但并不是签在自己姓名旁,更有学生签到了别的签到表上……

  现在只能根据这签到表和名册上的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();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值