题目描述:
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式:
输入在第一行给出正整数 N,取值在(0,105];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按
yyyy/mm/dd
(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。输出格式:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入样例:
5 John 2001/05/12 Tom 1814/09/06 Ann 2121/01/30 James 1814/09/05 Steve 1967/11/20
输出样例:
3 Tom John
基本思路:
(1)定义一个结构体Person来存储每个人的姓名、出生日期
(2)定义Person数组,存储每行输入的数据
(2)由于输出的日期格式为 年/月/日,因此要先将此日期字符串中的分隔符去掉,转为只含数字的字符串,再将其转为int 类型的数字,才可以比较大小
(3)设立一个left 最小日期边界和right 最大日期边界,用计数器count记录在此范围内的合法日期
(4)为求得年龄最大和最小值,首先定义一个最小日期,值和left值相等;也定义一个最大日期,值和right值相等。遍历数组,
每次更新最年长、最年轻的出生日期,并记录对应的姓名
对应代码如下:
package pat;
import java.util.Scanner;
//人口普查
public class B1028 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
Person ps[] = new Person[k];
for (int n = 0; n < k; n++) {
ps[n] = new Person(sc.next(), sc.next());
}
String minname = new String();
String maxname = new String();
int count = 0;// 记录有效生日个数
int min = 18140906;
int max = 20140906;
int left = min;
int right = max;
for (int i = 0; i < k; i++) {
int t = Integer.parseInt(ps[i].date.replaceAll("/", ""));// 字符串转为整数
if (t > left&& t < right) {// 日期合法
count++;
if (t > min) {// 寻找最大值
min = t;
minname = ps[i].name;
}
if (t < max) {// 寻找最小值
max = t;
maxname = ps[i].name;
}
}
}
sc.close();
System.out.print(count +" "+ minname+" " + maxname);
}
}
class Person {
String name;
String date;
// 构造函数
public Person(String name, String date) {
this.name = name;
this.date = date;
}
}