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);
}
}