其他分享
首页 > 其他分享> > 29_506. 相对名次

29_506. 相对名次

作者:互联网

题目描述:
image
解题思路:

  • 利用二维数组:可以将分数score和运动员编号i放到一个n行2列的二维数组中,至于为什么是n行2列而不是2行n列,是因为在利用java的sort排序时,可以按照第几列来进行排序,不会改变每一行元素的相对顺序,然后对score这一列进行排序。

  • 利用hash表:可以将score复制到数组clone中去,然后将clone和名次序号一一对应放入到hash表中,再根据运动员编号i的score从hash表中查找到其对应名次即可。

代码:

利用二维数组
//利用二维数组
class Solution {
    public String[] findRelativeRanks(int[] score) {
        String[] ranks = {"Gold Medal","Silver Medal","Bronze Medal"};
        int n = score.length;
        int[][] arr = new int[n][2];
        for (int i = 0; i < n; i++) {
            arr[i][0] = score[i];
            arr[i][1] = i;
        }
        Arrays.sort(arr, (a,b)->(b[0] - a[0]));
        String[] ans = new String[n];
        for (int i = 0; i < n; i++) {
            if (i < 3) {
                ans[arr[i][1]] = ranks[i];
            }else {
                ans[arr[i][1]] = Integer.toString(i + 1);
            }
        }
        return ans;
    }
}
利用hash表
//利用hash表
class Solution {
    public String[] findRelativeRanks(int[] score) {
        String[] ranks = {"Gold Medal","Silver Medal","Bronze Medal"};
        HashMap<Integer,Integer> map = new HashMap<>();
        int n = score.length;
        String[] ans = new String[n];
        int[] clone = score.clone();
        Arrays.sort(clone);
        for (int i = n - 1; i >= 0; i--) {
            map.put(clone[i], n - i - 1);
        }
        for (int i = 0; i < n; i++) {
            if (map.get(score[i]) < 3) {
                ans[i] = ranks[map.get(score[i])];
            }else {
                ans[i] = Integer.toString(map.get(score[i]) + 1);
            }
        }
        return ans;
    }
}

标签:arr,名次,String,int,clone,29,score,ans,506
来源: https://www.cnblogs.com/forrestyu/p/16178263.html