题目:

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 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

思路:通过设置最大年纪和最小年纪,让输入值去进行比较,总体不难,但是这里有一个问题,就是会超时。

这是代码超时16分代码:

N = int(input())
up = '2014/09/06'
down = '1814/09/06'
max_day = down  # 记录年纪最大的人,初始为最小值
min_day = up    # 记录年纪最小的人,初始为最大值
# total,old,young记录合格人数,最大的人和最小的人姓名
total, old, young = 0, 0, 0 
for i in range(N):
    lst = input().split()
    date = lst[1]
    if down <= date <= up:
        total += 1
        if date >= max_day:
            max_day = date
            young = lst[0]
        if date <= min_day:
            min_day = date
            old = lst[0]
if total != 0:
    print(total, old, young)
else:
    print('0')

然后经过多次修改和参考别人代码,主要是将数据存入列表那里花费时间,所以这里不存入列表,采用字符串切割的方法获取对应的值,刚开始以为超时的另一个原因可能是input() 和sys.stdin.readline() 函数的问题,但是后面多次对比后发现并没有影响,后面发现还是有影响。这俩个函数就是后面那个函数会将每段末尾的回车读进来,在进行切割时向前移一位就行。

成功过一次的代码:

N = int(input())
up = '2014/09/06'
down = '1814/09/06'
max_day = down
min_day = up
total, old, young = 0, 0, 0
for i in range(N):
    lst = input()
    date = lst[-10:]
    if down <= date <= up:
        total += 1
        if date > max_day:
            max_day = date
            young = lst[:-10].strip()
        if date < min_day:
            min_day = date
            old = lst[:-10].strip()
if total != 0:
    print(total, old, young)
else:
    print('0')

发现还是输入那俩个函数的问题,上面那个成功了一次我以为没影响,多次测试后还是用了sys模块的输入函数。

最终代码:

import sys

N = int(input())
up = '2014/09/06'
down = '1814/09/06'
max_day = down
min_day = up
total, old, young = 0, 0, 0
for i in range(N):
    lst = sys.stdin.readline()
    date = lst[-11:-1]
    if down <= date <= up:
        total += 1
        if date > max_day:
            max_day = date
            young = lst[:-11].strip()
        if date < min_day:
            min_day = date
            old = lst[:-11].strip()
if total != 0:
    print(total, old, young)
else:
    print('0')