我正在尝试解决这个HackerRank问题。
https://www.hackerrank.com/challenges/climbing-the-leaderboard/problem
这个问题的一般想法是,当Alice进入排行榜时,我需要在每场比赛后输出她的排名。
我的代码正在针对除TestCase 6,7,8,9之外的所有测试,这是因为它获得了RunTime Error。
这是我的代码:
from itertools import count
#Hackerrank Code
scores_count = int(input())
scores = list(map(int, input().rstrip().split()))
alice_count = int(input())
alice = list(map(int, input().rstrip().split()))
#My Code Starts from here
main_list = [sorted(scores+[i], reverse=True) for i in alice]
track = []
for sub in main_list:
seen = {}
c = count()
next(c)
ss = []
for j in sub:
try:
ind = seen[j]
except KeyError:
ind = seen[j] = next(c)
ss.append((j, ind))
track.append(ss)
flicker = []
for x in track:
gatter = dict(x)
flicker.append(gatter)
trackstar = [d.get(key) for key, d in zip(alice, flicker)]
for m in trackstar:
print(m)
我想知道我的代码中显示运行时错误的缺陷在哪里,我该如何修复它。我使用的是Python 3.x
答案 0 :(得分:1)
为避免因运行时间过长导致的超时,请使用一组分数,而不是列表:
如果你10**8
ppl坐在排名3上并得到相同的分数,你会得到很长的名单 - 完全不需要,因为他们的其他10**8-1
ppl坐在3级也没有贡献根本不是Alices排名 - 但是他们进行了所有排序和迭代, 多 更长
一个非常基本的解决方案是:
input() # discard
scores = map(int,input().strip().split(' '))
input() # discard
alice = list(map(int,input().strip().split(' ')))
leaderboard = sorted(set(scores), reverse = True) # discard any identical scores before
# sorting, sort by reverse so lowest score is last item in scores
l = len(leaderboard) # start with lowest score
# assumes alice never gets worse after playing games
for a in alice:
while (l > 0) and (a >= leaderboard[l-1]):
l -= 1 # climb the board
print (l+1)
这只会从总分数列表中的最后得分开始,而不是从每个Alices部分得分的最低分数开始。