ACwing4269-校庆

本文通过分析一道编程题目,展示了在处理大量输入数据时,使用BufferedReader代替Scanner可以显著提升程序效率。作者提供了两个Java实现版本,分别使用Scanner和BufferedReader,并解释了在大输入量场景下为何BufferedReader更优。代码示例中,程序需要统计校友与参加校庆人士的信息,包括校友人数和最年长者的身份证号。
摘要由CSDN通过智能技术生成

title: ACwing4269-校庆
date: 2022-06-16 20:28:39
tags: 输入输出

题目

2019年浙江大学将要庆祝成立 122 周年。

为了准备校庆,校友会收集了所有校友的身份证号。

现在需要请你编写程序,根据来参加校庆的所有人士的身份证号,统计来了多少校友。

输入格式

输入在第一行给出正整数 N。

随后 N 行,每行给出一位校友的身份证号(18 位由数字和大写字母 X 组成的字符串)。题目保证身份证号不重复。

随后给出前来参加校庆的所有人士的信息:

首先是一个正整数 M。

随后 M 行,每行给出一位人士的身份证号。题目保证身份证号不重复。

输出格式

首先在第一行输出参加校庆的校友的人数。

然后在第二行输出最年长的校友的身份证号 —— 注意身份证第 7−14位给出的是 yyyymmdd 格式的生日。

如果没有校友来,则在第二行输出最年长的来宾的身份证号。题目保证这样的校友或来宾必是唯一的。

数据范围

1≤N,M≤105

输入样例:

5
372928196906118710
610481197806202213
440684198612150417
13072819571002001X
150702193604190912
6
530125197901260019
150702193604190912
220221196701020034
610481197806202213
440684198612150417
370205198709275042

输出样例:

3
150702193604190912

笔者解析

本题的输入输量巨大,而输出量却相对较少。在java编程中对于巨大的输出,我们应该尽量选择使用BufferedReader,而不是使用Scanner进行输入。两者的输入输出效率差异巨大,具体可由下图所示。

Scanner输入

G41DB4_4~___W_UVU__TVIN.png

BufferedReader输入

~B1C77_06_6N9B_0LTX4_2U.png

可见两者的效率差距还是特别巨大的,所以在这种输入量比较大的情况下尽量使用BufferedReader进行输入

笔者代码

Scanner版本

import java.util.HashSet;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        HashSet<String> alumnus = new HashSet<>();
        HashSet<String> come = new HashSet<>();
        HashSet<String> alumnusCome = new HashSet<>();

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            //存储所有校友
            alumnus.add(scanner.next());
        }

        int m = scanner.nextInt(),count = 0;
        String temp;
        for (int i = 0; i < m; i++) {
            temp = scanner.next();come.add(temp);
            if(alumnus.contains(temp)){
                alumnusCome.add(temp);
                count++;
            }
        }

        System.out.println(count);
        int old = Integer.MAX_VALUE,t;
        String oldNum = null;
        if(count>0){
           come = alumnusCome;
        }
        for ( String men:come) {
            temp = men.substring(6,14);
            t = Integer.parseInt(temp);
            if(old > t){
                old = t;
                oldNum = men;
            }
        }
        System.out.println(oldNum);
    }
}

BufferedReader版本

import java.io.*;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        HashSet<String> alumnus = new HashSet<>();
        HashSet<String> come = new HashSet<>();
        HashSet<String> alumnusCome = new HashSet<>();
        
        //首先在第一行输出参加校庆的校友的人数。
        int n = Integer.parseInt(reader.readLine());
        for (int i = 0; i < n; i++) {
            //存储所有校友
            alumnus.add(reader.readLine());
        }

        int m = Integer.parseInt(reader.readLine()),count = 0;
        String temp;
        //随后给出前来参加校庆的所有人士的信息:
        for (int i = 0; i < m; i++) {
            temp = reader.readLine();
            //加入来宾set中
            come.add(temp);
            //如果属于校友就加入 校友来宾set
            if(alumnus.contains(temp)){
                alumnusCome.add(temp);
                count++;
            }
        }

        System.out.println(count);
        int old = Integer.MAX_VALUE,t;
        String oldNum = null;
        //有校友来就从来了的校友里找年纪最长者,否则就到所有来宾中间找
        if(count>0){
            come = alumnusCome;
        }
        for ( String men:come) {
            temp = men.substring(6,14);
            t = Integer.parseInt(temp);
            if(old > t){
                old = t;
                oldNum = men;
            }
        }
        System.out.println(oldNum);
        reader.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值