先来看看题目LeetCode 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 位运动员的获奖情况。

题解

题目的意思,是要我们把第i号的运动员的分数换成名次,然后以vector<string>返回,特别是前三名,要改成Gold Medal、Silver Medal、Bronze Medal。其实非常简单,下面来看解决方案。

1.先执行一次for循环,因为分数是唯一的,用Map保存得分与选手号,关系为<得分,运动员>。

2.对score执行一次降序排序后,其元素的下标就是获得这个分数的运动员的排名。

3.再执行一次for循环,将第i号运动员的排名填入vector<string>[i]中,表示为vector<string>[Map[score[i]]]= i+1,请慢慢消化这些关系。噢对了,

”名次第 1 的运动员获金牌 “Gold Medal” 。
名次第 2 的运动员获银牌 “Silver Medal” 。
名次第 3 的运动员获铜牌 “Bronze Medal” 。“

还记得它吗,如果名次表示为1,2,3,请记得为这些优秀的运动员们戴上相应的奖牌。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& score)
{
map<int,int> socre_m;
vector<string> ans(score.size());
for(int i=0;i<score.size();i++)
{
socre_m[score[i]]=i;
}
sort(score.rbegin(),score.rend());
for(int i=0;i<score.size();i++)
{
ans[socre_m[score[i]]]=to_string(i+1);
if(i==0)
ans[socre_m[score[i]]]="Gold Medal";
if(i==1)
ans[socre_m[score[i]]]="Silver Medal";
if(i==2)
ans[socre_m[score[i]]]="Bronze Medal";
}
return ans;
}
};

以上就是我对于本题的自己的理解与做法,但这样的解法肯定不是最优解。如果您有更好的解决方法,欢迎在下方评论区回复。

PS :

排序函数的使用方法sort(iterator begin,iterator end),默认是升序。
对于一个c++的容器来说,如果想要降序排序,以vector为例子,就是sort(vecotr.rbegin(),vecotr.rend()),这是一个方便的写法。