这个二等分函数实现不正确吗?

时间:2019-06-30 09:27:25

标签: python python-3.x

我正在尝试编写一个函数,该函数返回Python中名为Alice的女孩的排名。所使用的排名系统的类型是“密集排名”系统,这意味着所有具有相同分数的人都将获得相同的排名。我输入了两个列表。第一个(分数)是所有玩家(当然,除了爱丽丝)的分数列表。第二个列表(alice)包含alice在“ n”次尝试中获得的分数。每次尝试她的分数都会增加。每次尝试后,我们必须从函数中返回一个列表,该列表包含排行榜上爱丽丝的排名。

我尝试了很多方法来做到这一点。同时没有一个既简单又快速。最后,我找到了一个名为bisect_right的内置函数,该函数非常适合我的目的(尽管我认为它不能满足我的需求足够快,但是我仍然想试一试),但是我想要的输出却不是我哪里错了?这是我的代码:

def climbingLeaderboard(scores, alice):
     res=[]
     unique=list(set(scores))
     unique.reverse()
     length=len(unique)
     for alice_score in alice:
         temp=bisect_right(unique,alice_score)
         res.append(length-temp+1)
     return res

如果得分为[100,90,90,80,75,60](请注意,有两名得分为90的球员,他们都排名第二) 并且alice数组为[50,65,77,90,102],输出应为6,5,4,2,1(每个元素是每次播放后Alice的排名),但实际输出为:6,5,5 ,2,1

为什么会这样?我做错什么了吗?

编辑:这个问题更多地关注如何在该问题中使用二等分函数,而不是其他复杂方法的时间复杂性。

1 个答案:

答案 0 :(得分:-1)

我对数组的排序错误。我忘记了“反向”会以相反的顺序对数组进行排序。

这是有效的最终代码:

res=[]
unique=list(set(scores))
unique.sort()     
length=len(unique)
for alice_score in alice:
    temp=bisect-right(unique,alice_score)    #but bisect works too, i don't know why
    res.append(length-temp+1)
return res