acwing校庆

20192019年浙江大学将要庆祝成立 122122 周年。

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

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

输入格式

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

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

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

首先是一个正整数 MM。

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

输出格式

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

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

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

数据范围

1≤N,M≤1051≤N,M≤105

输入样例:

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

输出样例:

3
150702193604190912

解题思路:
本题需要进行时间复杂度判断:因为元素最大为10^5个,如果直接暴力解法判断,时间复杂度为n^2,时间会溢出;本题时间主要在进行参加校庆的学生的判断,故可以用hashset集合存储来参加校庆的学生,利用contains()方法进行判断,并且设置标志记录来参与宴会的学生数目。

根据参加学生的数目可分为两种情况:

1.当数目为0,需要遍历一次hashset集合,比较并记录年龄最大的学生,即出生年月日最小的元素

2.当数目不为0时,需要遍历校庆学生数组,并借助hashset集合判断是否该学生来校庆,记录并存储年龄最大身份证

具体代码如下:



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;

public class Main{
    public static void main(String [] args) throws IOException{

       BufferedReader bufferedReader =  new BufferedReader(new InputStreamReader(System.in));
       //读取字符串总行数
       String s = bufferedReader.readLine();
       //获取校友数
       int n = Integer.parseInt(s);
       //创建大数组存储信息
        People [] peoples = new People[100005];
        HashSet<String> hashSet = new HashSet<>();
       //循环读取元素
       for(int i = 0; i < n; i++){
            //存放元素
            s = bufferedReader.readLine();
            peoples[i] = new People(s);
       }
       //输入来宾数
       int m = Integer.parseInt(bufferedReader.readLine());
       //存储来宾信息
       for(int i = 0; i < m; i++){
            s = bufferedReader.readLine();
            hashSet.add(s);
       }
       s = null;
       String s1 = null;
       //遍历寻找
       int sum = 0;
       for(int i = 0 ; i < n; i++){
            if(hashSet.contains(peoples[i].indentity)){
                sum++;
                if(s != null && s1.compareTo(peoples[i].birth) > 0){
                    s = peoples[i].indentity;
                    s1 = s.substring(6,14);
                }else if(s == null){
                    s = peoples[i].indentity;
                    s1 = s.substring(6,14);
                }
            }
       }
       if(sum == 0){
           for(String a : hashSet){
               if(s == null){
                   s = a;
                   s1 = s.substring(6,14);
               }else if(s1.compareTo(a.substring(6,14)) > 0){
                    s = a;
                    s1 = s.substring(6,14);
               } 
           }
       }
       System.out.println(sum);
       System.out.println(s);
    }
}

class People{
    //身份证号码
    String indentity;
    //出生年月日
    String birth;
    //标志是否为校友

    public People(String indentirty){
        this.indentity = indentirty;
        this.birth = indentirty.substring(6,14);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值