c
codeye
V1
2022/09/28阅读:15主题:默认主题
Sorted()函数的key用法
在这个任务中,你将按照参加运动会的运动员的年龄为依据排序,对于相同年龄的运动员则按照相同年龄的人数越多,排在越靠前的位置。即元素频率的递减对数组中的元素进行排序。如果两个元素有相同的频率,就按增加值排序。
解释
([22,23,25,23,17,19,25,23,17]) =>
[23,23,23,25,25,17,17,22,19]
。 --我们按最高频率到最低频率排序。如果两个元素有相同的频率,我们就按增加值排序。 更多的例子在测试案例中。
祝您好运!
from collections import Counter
def solve(arr):
arrs = Counter(arr)
return sorted(arr,key= lambda x:[arrs[x],-x],reverse=True)
key = count
def solve(arr):
return sorted(sorted(arr, reverse=False), key=arr.count, reverse=True)
升级任务
请同时尝试简单时差,请参考之前的时间表达链接文章
你将得到一系列警报响起的时间。你的任务是确定警报之间的最大时间间隔。每个警报在相应的分钟开始时开始响起,并正好响起1分钟。数组中的时间不是按时间顺序排列的。如果有重复的时间,请忽略。
比如说。
solve(["14:51"]) = "23:59"。
如果闹钟现在响起,它将在另外23小时59分钟内不会响起。
solve(["23:00", "04:22", "18:05", "06:24"]) == "11:40"
闹钟不响的最大间隔时间是11小时40分钟。 在第二个例子中,警报在一天内响了4次。
solve(["14:51"])
"23:59"
solve(["23:00","04:22","18:05","06:24"])
"11:40"
solve(["21:14", "15:34", "14:51", "06:25", "15:30"])
"09:10"
更多的例子在测试案例中。祝您好运!
子函数松耦合,结构清晰可读性高!
def time_to_min(tm):
h, m = map(int, tm.split(':'))
return 60 * h + m
def min_to_time(mn):
return '{:02}:{:02}'.format(*divmod(mn, 60))
def solve(arr):
marr = [time_to_min(t) for t in sorted(arr)]
marr.append(marr[0] + 24 * 60)
mx = max(y-x for x, y in zip(marr, marr[1:])) - 1
return min_to_time(mx)
仅供参考写法 1st
from datetime import datetime
def solve(arr):
dts = [datetime(2000, 1, 1, *map(int, x.split(':'))) for x in sorted(arr)]
delta = max(int((b - a).total_seconds() - 60) for a, b in zip(dts, dts[1:] + [dts[0].replace(day=2)]))
return '{:02}:{:02}'.format(*divmod(delta//60, 60))
2nd
def solve(arr):
arrs = sorted(arr)
#特判只有一个时间,返回指定值
if len(arr)>= 2:
maxt= parse(arrs[1]) - parse(arrs[0])
else:return "23:59"
maxt= parse(arrs[1]) - parse(arrs[0])
arrzip = arrs[1:] + [arrs[0]]
#获取逐个时间段的时间间隔
for s,t in list(zip(arrs,arrzip)):
maxst = []
delta = parse(t) - parse(s)
#打擂台找出时间间隔最大的,秒为单位
if delta.seconds > maxt.seconds:
maxt = delta
maxst.extend([parse(t),parse(s)])
m,s = divmod(maxt.seconds - 60,60)
h,m = divmod(m,60)
#转换为“00:00”格式,丢弃秒
return f"{h:0>2}:{m:>2}"
作者介绍
c
codeye
V1