当前位置: 面试刷题>> 相对排名 (经典算法题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);
```
在以上代码中,我们首先通过排序(降序)和去重处理分数数组,然后为每个独特的分数分配一个排名。之后,我们根据原始分数列表的顺序,通过查找分数对应的排名来构建最终的排名数组。这种方法确保了相同的分数有相同的排名,并且排名是基于分数降序排列的。