JS 笔试题——相对名次

2021-12-02  本文已影响0人  袭明_

给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都互不相同 。

运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况:

使用长度为 n 的数组 answer 返回获奖,其中 answer[i] 是第 i 位运动员的获奖情况。

示例 1:

输入:score = $[5,4,3,2,1]
输出:["Gold Medal","Silver Medal","Bronze Medal","4","5"]

示例 2:

输入:score = [10,3,8,9,4]
输出:["Gold Medal","5","Bronze Medal","Silver Medal","4"]

分析:

  1. 分数数组需要降序排列,这里实现插入排序法和快速排序法两种。
  2. 遍历分数数组中每一个分数对应的名次。
  3. 如果是前三,则返回"Gold Medal""Silver Medal""Bronze Medal"。其他返回序号即可。

完整代码:

/**
 * @param {number[]} score
 * @return {string[]}
 */
var findRelativeRanks = function(score) {
    let name = ["Gold Medal","Silver Medal","Bronze Medal"];
    let arr = score.concat([]);
    quickSort(arr); // 这里也可以使用 insertSort
    let ans = [];
    for (let i = 0; i < score.length; i++) {
        let idx = arr.indexOf(score[i]);
        if (idx < 3) {
            ans.push(name[idx]);
        } else {
            ans.push(idx + 1 + '');
        }
    }
    return ans;
};

var insertSort = function (arr) {
    let j;
    for (let i = 1; i < arr.length; i++) {
        let cur = arr[i];
        for (j = i; j > 0; j--) {
            if (arr[j - 1] < cur) {
                arr[j] = arr[j - 1];
            } else {
                break;
            }
        }
        arr[j] = cur;
    }
}

var quickSort = function (arr) {
    let sort = ((arr, left, right) => {
        let p = Math.floor((left + right) / 2);
        let pivot = arr[p];
        let i = left, j = right;
        while (i < j) {
            for (; !(i >= p || arr[i] < pivot); i++) {}
            if (i < p) {
                arr[p] = arr[i];
                p = i;
            }

            for (; !(j <= p || arr[j] > pivot); j--) {}
            if (p < j) {
                arr[p] = arr[j];
                p = j;
            }
        }
        arr[p] = pivot;

        if (p - left > 1) {
            sort(arr, left, p - 1);
        }
        if (right - p > 1) {
            sort(arr, p + 1, right);
        }
    });
    sort(arr, 0, arr.length);
}
上一篇下一篇

猜你喜欢

热点阅读