当前位置: 代码迷 >> 综合 >> 1028 人口普查python3无超时
  详细解决方案

1028 人口普查python3无超时

热度:86   发布时间:2024-01-29 10:17:08.0

文章目录

      • 1、最初代码
      • 2、改进后代码

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 sysn=int(input())max_name=''
min_name=''
max_time='20140906'
min_time='18140906'i=0for _ in range(n):s=sys.stdin.readline()time=s[-11:-7]+s[-6:-4]+s[-3:-1]if time<'18140906' or time >'20140906':continueelse:i+=1if time>min_time:min_time=timemin_name=s[:-12]if time<max_time:max_time=timemax_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位字符串,统一操作程序运行时间会更快。

  相关解决方案