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也行
没有什么特定的做法