[数组排序] 0506. 相对名次
文章目录
- 1. 题目链接
- 2. 题目大意
- 3. 示例
- 4. 解题思路
- 5. 参考代码
1. 题目链接
506. 相对名次 - 力扣(LeetCode)
2. 题目大意
描述:给定一个长度为 n 的数组 score。其中 score[i] 表示第 i 名运动员在比赛中的成绩。所有成绩互不相同。
要求:找出他们的相对名次,并授予前三名对应的奖牌。前三名运动员将会被分别授予「金牌("Gold Medal"
)」,「银牌("Silver Medal"
)」和「铜牌("Bronze Medal"
)」。
说明:
- n==score.length。
- 1≤n≤104。
- 0≤score[i]≤106。
- score 中的所有值互不相同。
3. 示例
输入:score = [5,4,3,2,1]
输出:["Gold Medal","Silver Medal","Bronze Medal","4","5"]
解释:名次为 [1st, 2nd, 3rd, 4th, 5th] 。
输入:score = [10,3,8,9,4]
输出:["Gold Medal","5","Bronze Medal","Silver Medal","4"]
解释:名次为 [1st, 5th, 3rd, 2nd, 4th] 。
4. 解题思路
- 先对数组 scorescore 进行排序。
- 再将对应前三个位置上的元素替换成对应的字符串:
**"Gold Medal"**
,**"Silver Medal"**
,**"Bronze Medal"**
。
5. 参考代码
public class Solution {public int[] shellSort(int[] arr) {int size = arr.length;int gap = size / 2;while (gap > 0) {for (int i = gap; i < size; i++) {int temp = arr[i];int j = i;while (j >= gap && arr[j - gap] < temp) {arr[j] = arr[j - gap];j -= gap;}arr[j] = temp;}gap = gap / 2;}return arr;}public String[] findRelativeRanks(int[] score) {int[] nums = score.clone();nums = shellSort(nums);Map<Integer, Integer> scoreMap = new HashMap<>();for (int i = 0; i < nums.length; i++) {scoreMap.put(nums[i], i + 1);}String[] res = new String[score.length];for (int i = 0; i < score.length; i++) {if (score[i] == nums[0]) {res[i] = "Gold Medal";} else if (score[i] == nums[1]) {res[i] = "Silver Medal";} else if (score[i] == nums[2]) {res[i] = "Bronze Medal";} else {res[i] = String.valueOf(scoreMap.get(score[i]));}}return res;}
}