给出一个得分列表(例如5,5,4,2,2,0),我希望返回标准比赛排名(1,1,3,4,4,6)。
从Wikipedia's ranking page开始,这里是SRC的摘要:
标准比赛排名(“1224”排名)
在比赛排名中,比较相等的项目会相同 排名数字,然后在排名数字中留下差距。该 在这个差距中遗漏的排名数量少一个 比相等的项目数量。等价地,每个 item的排名是1加上排名高于它的项目数。 这种排名策略经常被用于竞赛,因为它 意味着如果两个(或更多)竞争者在一个位置上占据一席之地 排名,排名低于他们的所有人的位置不受影响 (即,只有一个人得分,竞争者才会获得第二名 比他们好,第三,如果恰好有两个人得分比他们好, 第四,如果恰好三个人得分比他们好,等等。)
因此,如果A排在B和C之前(比较相等),则两者都是 排在D之前,然后A得到排名第1(“第一”),B得到 排名第2(“联合第二”),C也排名第2 (“联合秒”)和D得到排名第4(“第四”)。在这种情况下, 没有人会得到排名第3(“第三”),这将留下 差距。
任何语言的代码都非常有用。
另外,我有兴趣看到其他排名类型的算法(修改后的竞争排名,密集排名,序数排名和小数排名)。
答案 0 :(得分:8)
以下是如何操作:
ranking[0]
设为1。i
- 列表中的每个索引score
score[i]
等于score[i-1]
,他们应该具有相同的ranknig:
ranking[i] = ranknig[i-1]
ranking[i] = i + 1
+ 1
由于基于0的差异和基于1的排名而来)以下是Java中的示例实现:
// Set up some sample scores.
int[] scores = { 5, 5, 4, 2, 2, 0 };
// Initialize a ranking array
int[] rankings = new int[scores.length];
// Fill in each position
rankings[0] = 1;
for (int i = 1; i < rankings.length; i++)
rankings[i] = scores[i] == scores[i-1] ? rankings[i-1] : i + 1;
// rankings = [1, 1, 3, 4, 4, 6]
答案 1 :(得分:1)
这是一些PHP代码:
$scores = array(5,5,4,2,2,0);
for($i = 0, $j = 0,
$stop = count($scores),
$last_score = -1; $i < $stop; $i++){
if($scores[$i] != $last_score){
$j = $i+1;
$last_score = $scores[$i];
}
$scores[$i] = $j;
}
// Now scores = [1,1,3,4,4,6]
如果您知道自己的分数已经有序,则可以删除rsort