当前位置: 面试刷题>> 相对排名 (经典算法题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 代码示例

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 代码示例

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 代码示例

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);

在以上代码中,我们首先通过排序(降序)和去重处理分数数组,然后为每个独特的分数分配一个排名。之后,我们根据原始分数列表的顺序,通过查找分数对应的排名来构建最终的排名数组。这种方法确保了相同的分数有相同的排名,并且排名是基于分数降序排列的。

推荐面试题