当前位置: 面试刷题>> 相对排名 (经典算法题500道)


### 题目描述补充 **题目:相对排名** 给定一个非负整数数组 `scores`,你的任务是计算每个分数的排名,其中排名是基于分数降序排列的。如果两个分数相同,则它们应该具有相同的排名,并且排名应该基于下一个不同的分数。换句话说,排名应该是连续的,并且相同的分数应该共享相同的排名。 **注意**: - 返回的排名数组应该与输入数组的长度相同。 - 返回的排名数组中的每个元素应该是一个整数。 **示例 1**: ``` 输入: scores = [5, 2, 5, 1, 3] 输出: [1, 4, 1, 5, 3] 解释: 第一个5和第二个5并列第一,因此它们都是1。然后2是第四名,1是第五名,3是第三名。 ``` **示例 2**: ``` 输入: scores = [2, 2, 3, 5] 输出: [1, 1, 2, 1] 解释: 第一个和第二个2并列第一,第三个分数是第三名,5和前面的分数都不同,因此它是第一名(但因为它已经排在了第三名之后,所以它仍然保持为第一名)。 ``` ### PHP 代码示例 ```php function createRanking($scores) { $rankMap = []; $sortedScores = $scores; arsort($sortedScores); // 降序排序 $rank = 1; $currentRank = 1; foreach ($sortedScores as $score) { if (!isset($rankMap[$score])) { $rankMap[$score] = $rank; $currentRank = $rank; $rank++; } } // 重建原始顺序的排名 $result = []; foreach ($scores as $score) { $result[] = $rankMap[$score]; } return $result; } // 示例 $scores = [5, 2, 5, 1, 3]; $ranking = createRanking($scores); print_r($ranking); ``` ### Python 代码示例 ```python def create_ranking(scores): rank_map = {} sorted_scores = sorted(set(scores), reverse=True) # 降序排序并去重 rank = 1 current_rank = 1 for score in sorted_scores: if score not in rank_map: rank_map[score] = rank rank += 1 # 根据原始分数列表构建排名 ranking = [rank_map[score] for score in scores] return ranking # 示例 scores = [5, 2, 5, 1, 3] ranking = create_ranking(scores) print(ranking) ``` ### JavaScript 代码示例 ```javascript function createRanking(scores) { const rankMap = {}; const uniqueScores = [...new Set(scores)].sort((a, b) => b - a); // 降序排序并去重 let rank = 1; let currentRank = 1; for (const score of uniqueScores) { if (!(score in rankMap)) { rankMap[score] = rank; rank++; } } // 根据原始分数列表构建排名 return scores.map(score => rankMap[score]); } // 示例 const scores = [5, 2, 5, 1, 3]; const ranking = createRanking(scores); console.log(ranking); ``` 在以上代码中,我们首先通过排序(降序)和去重处理分数数组,然后为每个独特的分数分配一个排名。之后,我们根据原始分数列表的顺序,通过查找分数对应的排名来构建最终的排名数组。这种方法确保了相同的分数有相同的排名,并且排名是基于分数降序排列的。
推荐面试题