测试点3在于如果输入的几个数据都不在范围内,要不大于20140906, 要不小于18140906,这一原因没考虑进去;
测试点4主要是python本身原因,当然更可能是我自己没有优化好,现在已经解决好了!
下面代码的依次修改 以及 思路:
初始代码:(完全不建议)(测试点4不通过,运行超时)
num = int(input()) time = {} for i in range(num): name, date = input().split() date = int(''.join(list(date.split('/')))) if date > 20140906: continue if date < 18140906: continue time[name] = date name = list(time.keys()) date = list(time.values()) leg = len(name) if leg != 0: d, d_1 = date[0], 0 c, c_1 = date[0], 0 for i in range(1, leg): if d < date[i]: d = date[i] d_1 = i if c > date[i]: c = date[i] c_1 = i print('{} {} {}'.format(leg, name[c_1], name[d_1])) else: print(0)
第一次修改: (优化又测试点4(运行超时)依旧不行,但是代码简化了很多)
现在对上面代码做下面几个方面的修改:
1.修改1:比较字符串这里不需要将譬如2014/09/06先去掉/在转化int型
(即转化为20140906,之前我还更傻,把20140906再转化为[2014, 9, 6]依次进行比较年月日,十分十分麻烦!哭了)
可以直接进行字符串比较(类似于strcmp()方法),这里举个例子如下代码
time = {} name = 'John' date = '2014/09/06' if date >= '1814/09/06' and date <= '2014/09/06': time[name] = date
2.修改2,之前日期比大小,自己去比,其实用列表的sort()可以将字符串从小到大排列,最后取最左侧和最右侧即可
num = int(input()) time = [] def code(num): return num[0] for i in range(num): name, date = input().split() if date >= '1814/09/06' and date <= '2014/09/06': time.append((date, name)) time.sort(key=code) # 以传入的第二个参数进行排序 if len(time) != 0: # 剑指测试3,假使系统传入了很多数据,但是没有一个是符合要求的,那么输出报错 print(len(time), time[0][1], time[-1][1]) else: print(0)
第二次修改:上面又建立列表,又对列表进行排序,实际上是多出了很多多余得到步骤
(1).我们只是需要获取最大的日期,和最小的日期,不需要将所有的日期都存储在列表中然后对列表进行排序,这样子虽然存储很容易,排序也只需要sort()一下就好了,但是会增加时间和空间
(2).我们不需要获取所有名字和日期,我们只是在当前循环会用到一次,之后就不会用到,所以不需要保存在列表里 。
当然,这里虽然比上面的稍微复杂一点,但是时间运行会短
完美!!!!
num = int(input()) time = [] min_date = '1814/09/06' # 年龄最小者出生日期的初识值 max_date = '2014/09/06' # 年龄最大者出生日期的初识值 count = 0 # 计算满足在1814/09/06日期至2014/09/06的人数,初始值为0 for i in range(num): # 传入num个人,所以进行num次循环 name, date = input().split() if date <= '2014/09/06' and date >= '1814/09/06': # 符合0-200岁的进入下方代码 if date >= min_date: # 筛选年龄最小者的name和date min_name = name min_date = date if date <= max_date: # 筛选年龄最大者的name和date max_date = date max_name = name count += 1 if count != 0: print('{} {} {}'.format(count, max_name, min_name)) else: print(0)