PAT 乙级1028 人口普查 JAVA实现

 

题目描述:

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入格式:

输入在第一行给出正整数 N,取值在(0,10​5​​];随后 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;
	}
}
发布了13 篇原创文章 · 获赞 11 · 访问量 875

猜你喜欢

转载自blog.csdn.net/weixin_43156201/article/details/104095442