1028 人口普查python3无超时

1、最初代码

#!/usr/bin/env python
# -*-coding:utf-8 -*-
'''
@File    :   1028.py
@Time    :   2020/04/04 19:40:11
@Author  :   Schiller Xu 
@Version :   1.0
@Contact :   schillerxu@qq.com
@License :   (C)Copyright 2020-2021, SchillerXu
@Desc    :   None
'''

n=int(input())

data=[input().split() for i in range(n)]

for i in range(len(data)-1,-1,-1):
    t=data[i][1].split('/')
    s=int(t[0]+t[1]+t[2])
    if s<18140906 or s>20140906:
        data.pop(i)
    else:
        data[i].append(s)

data.sort(key=lambda x: x[-1])
lens=len(data)
if lens==0:
    print(0)
else:
    print("{} {} {}".format(lens,data[0][0],data[-1][0]))

把数据放到列表里面,再删除不合规的数据,占用了大量时间。改进思路有两个:

  1. 将合规数据放在列表中,然后排序;
  2. 假定年龄最小出生日期为1814/09/06,年龄最大的出生日期为2014/09/06,然后逐一比较,得到数据。

2、改进后代码

第一种没试过,下面给出第二种代码:

#!/usr/bin/env python
# -*-coding:utf-8 -*-
'''
@File    :   1028-1.py
@Time    :   2020/07/17 10:18:18
@Author  :   Schiller Xu 
@Version :   1.0
@License :   (C)Copyright 2020-2021, SchillerXu
@Desc    :   None
'''

import sys

n=int(input())

max_name=''
min_name=''
max_time='20140906'
min_time='18140906'

i=0

for _ in range(n):
    s=sys.stdin.readline()
    time=s[-11:-7]+s[-6:-4]+s[-3:-1]
    if time<'18140906' or time >'20140906':
        continue
    else:
        i+=1
        if time>min_time:
            min_time=time
            min_name=s[:-12]
        if time<max_time:
            max_time=time
            max_name=s[:-12]
# print(i,max_name,min_name)
if i==0:
    print(i)
else:
    print(f'{i} {max_name} {min_name}')

因为日期是根据“yyyy/mm/dd”格式给定,所以无论在获取出生日期和姓名的时候,用字符串分割就行,不像1025反转链表,最后一个元素的next是“-1”,而不是5位字符串,如果能统一成5位字符串,统一操作程序运行时间会更快。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值