跳至正文

每日一题——506. 相对名次

506. 相对名次

给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。

运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况:

名次第 1 的运动员获金牌 “Gold Medal” 。
名次第 2 的运动员获银牌 “Silver Medal” 。
名次第 3 的运动员获铜牌 “Bronze Medal” 。
从名次第 4 到第 n 的运动员,只能获得他们的名次编号(即,名次第 x 的运动员获得编号 “x”)。
使用长度为 n 的数组 answer 返回获奖,其中 answer[i] 是第 i 位运动员的获奖情况。

public class Solution {
    public string[] FindRelativeRanks(int[] score) {
        int n = score.Length;
        int[][] arr = new int[n][];

        for (int i = 0; i < n; ++i) {
            arr[i] = new int[2];
            arr[i][0] = score[i];
            arr[i][1] = i;
        }//交错数组分别存储score和对应排序位序

        Array.Sort(arr, (a, b) => b[0] - a[0]);
        string[] ans = new string[n];
        for (int i = 0; i < n; ++i) {
            switch(i)
            {
                case 0:
                    ans[arr[i][1]] = "Gold Medal";
                    break;
                case 1:
                    ans[arr[i][1]] = "Silver Medal";
                    break;
                case 2:
                    ans[arr[i][1]] = "Bronze Medal";
                    break;
                default:
                    ans[arr[i][1]] = (i + 1).ToString();
                    break;
            }

        }
        return ans;
    }
}

难点在于怎么在保持数组原先顺序的情况下记录下位次

我在这个地方卡了很久

官方的思路我觉得我比较能理解

用一个交错数组来存放score数组本身和score的排序位次

以范例的 10 3 8 9 4为例

一开始默认排序是12345肯定不对

所以我们要对12345这个位次进行排序

Array.Sort(arr, (a, b) => b[0] – a[0]);

交错数组里存储了两个一维数组

我可以以行为基准

根据a的列与列来排序b的列与列

这样b由于初始化数值递增的原因

排序后就能反应a的位次了

之后就是输出到ans数组

不像我用switch用if也行

没有什么特定的做法

发表评论

您的电子邮箱地址不会被公开。