506. 相对名次『简单』

题目来源于力扣(LeetCode

一、题目

506. 相对名次

说明:

  • N 是一个正整数并且不会超过 10000。
  • 所有运动员的成绩都不相同。

二、解题思路

  1. 通过创建哈希数组方式,在哈希数组的对应索引上记录下 nums 数组中元素是否出现

  2. 倒序遍历哈希数组,同时定义变量 j 用于记录排名(从 1 开始)

  3. 前 3 名与前 3 名之前的分开操作

  4. 前 3 名需要判断是第 1,第 2 或第 3 名,再记录相应的字符串结果表示

  5. 前 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));
}
posted @ 2020-05-17 20:39  知音12138  阅读(205)  评论(0编辑  收藏  举报