给你一个长度为 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 位运动员的获奖情况。
示例 1:
输入:score = [5,4,3,2,1] 输出:["Gold Medal","Silver Medal","Bronze Medal","4","5"] 解释:名次为 [1st, 2nd, 3rd, 4th, 5th] 。 示例 2:
输入:score = [10,3,8,9,4] 输出:["Gold Medal","5","Bronze Medal","Silver Medal","4"] 解释:名次为 [1st, 5th, 3rd, 2nd, 4th] 。
提示:
n == score.length 1 <= n <= 104 0 <= score[i] <= 106 score 中的所有值 互不相同
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/relative-ranks 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
排序+hash
需要输出排名,我们可以所有排序算法快速得到排名,但是还要按原位置进行输出
所以我们可以增加一个map来映射位置,就是key为分数value为位置,我们就可以通过排名的分数找到获得该分数的人的位置
func findRelativeRanks(score []int) []string {
l := len(score)
if l < 3 { //特殊情况:长度小于3时
if l == 1 {
return []string{"Gold Medal"}
} else {
if score[0] > score[1] {
return []string{"Gold Medal", "Silver Medal"}
} else {
return []string{"Silver Medal", "Gold Medal"}
}
}
}
m := make(map[int]int) //增加映射
for i := 0; i < l; i++ {
m[score[i]] = i
}
sort.Ints(score) //排序
r := make([]string, l)
for i := 0; i < l-3; i++ {
r[m[score[i]]] = fmt.Sprintf("%d", l-i) //赋值
}
r[m[score[l-3]]] = "Bronze Medal"
r[m[score[l-2]]] = "Silver Medal"
r[m[score[l-1]]] = "Gold Medal"
return r
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 12 ms , 在所有 Go 提交中击败了 72.29% 的用户 内存消耗: 6.6 MB , 在所有 Go 提交中击败了 7.23% 的用户 通过测试用例: 17 / 17
本文由 mdnice 多平台发布