【发布时间】:2021-05-29 02:44:37
【问题描述】:
问题链接:https://www.hackerrank.com/challenges/climbing-the-leaderboard/problem
对于我的解决方案,它通过了两个“运行代码”测试用例,但在提交时,它只通过了 12 个测试用例中的 8 个,但由于超时而失败了 4 个。我猜解决方案本身是正确的。请对如何优化解决方案有任何想法?
一些小测试用例:
# Small Test case 1
ranked = [100, 90, 90, 80] ## already in descending order
player = [70, 80, 105]
## expected ans = [4, 3, 1]
# Small Test case 2
ranked = [100, 90, 90, 80] ## already in descending order
player = [70, 90, 105]
## expected ans = [4, 2, 1]
# Small Test case 3
ranked = [100, 100, 50, 40, 40, 20, 10] ## already in descending order
player = [5, 25, 50, 120]
## expected ans = [6, 4, 2, 1]
我的解决方案:
def climbingLeaderboard(_r, _p):
#print(f"Params passed:\nranked={_r}\nplayer={_p}")
ans = list()
for pidx, pscore in enumerate(_p):
#print(f"\nPos {pidx} : Player score = {pscore}")
crank = 1 ## set current rank as 1 at start of evaluation of a player score
if pscore >= _r[0]:
ans.append(1)
continue
for ridx, rscore in enumerate(_r[1:]):
#print(f"ridx={ridx} , RankedScore={rscore} , PlayerScore = {pscore} , crank={crank}")
if rscore < _r[ridx]: ## current ranked score < previous ranked score
crank += 1
if pscore >= rscore:
ans.append(crank)
break
else:
ans.append(crank+1)
#print(f"now ans={ans}")
return ans
print(f"\n\nFinal answer = {f1(ranked, player)}")
【问题讨论】:
-
假设他们给你一个很大的列表,在每个循环中创建
_r[1:]需要时间。您可以通过创建该子列表一次并重复使用它来节省时间,但实际上您甚至不需要它。您可以从(1,len(_r))运行循环并使用ridx-1 -
嗨。不完全确定您的意思是我应该在不必使用两个循环的情况下实现您的想法。下面的代码是我目前能想到的最好的代码,但同样的 4 个测试用例仍然失败。问题表明“排名”和“玩家”列表最多可以包含 10e5 个条目。
-
代码:def crawlLeaderboard(_r, _p): ans = list() _r1 = sorted(set(_r), reverse=True) len_r1 = len(_r1)rank_sublist = _r1[1:] for _p 中的 pscore:crank = 1 ## 在开始评估玩家得分时将当前排名设置为 1 if pscore >= _r1[0]: ..same logic... for i in range(1, len_r1): .. . 与以前相同的逻辑,但使用 _r1[i]
标签: python