506. 相对名次『简单』
题目来源于力扣(LeetCode)
一、题目
说明:
- N 是一个正整数并且不会超过 10000。
- 所有运动员的成绩都不相同。
二、解题思路
-
通过创建哈希数组方式,在哈希数组的对应索引上记录下 nums 数组中元素是否出现
-
倒序遍历哈希数组,同时定义变量 j 用于记录排名(从 1 开始)
-
前 3 名与前 3 名之前的分开操作
-
前 3 名需要判断是第 1,第 2 或第 3 名,再记录相应的字符串结果表示
-
前 3 名之后的排名只需要记录变量 j(即排名)
三、代码实现
public static String[] findRelativeRanks(int[] nums) {
// 创建与 nums 数组长度相同的 String 数组,用于返回结果
String[] strs = new String[nums.length];
int maxNum = nums[0];
// 找到 nums 数组中的最大值
for (int i : nums) {
maxNum = Math.max(maxNum, i);
}
// 创建哈希映射数组
int[] bucket = new int[maxNum + 1];
// 遍历 nums 数组,bucket 索引为 nums 元素,索引上的值为是否出现的标志
for (int i : nums) {
bucket[i] = 1;
}
// 变量 j 定义名次
int j = 1;
// 在 bucket 数组中对出现的元素进行排序,从 1 开始
for (int i = bucket.length - 1; i >= 0; i--) {
if (bucket[i] > 0) {
bucket[i] = j++;
}
}
// 遍历 nums 数组,根据元素值在 bucket 数组中取值,数值即为名次
for (int i = 0; i < nums.length; i++) {
int k = bucket[nums[i]];
if (k > 3) {
// 前 3 名之后的直接赋值名次
strs[i] = Integer.toString(k);
} else {
// 前 3 名需要单独赋值特殊字符串
if (k == 1) {
strs[i] = "Gold Medal";
} else if (k == 2) {
strs[i] = "Silver Medal";
} else {
strs[i] = "Bronze Medal";
}
}
}
return strs;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
int[] nums = {5, 4, 3, 2, 1};
// output:{"Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"}
String[] result = findRelativeRanks(nums);
System.out.println(Arrays.toString(result));
}