找出排名第三大的分数

问题描述

小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:

  1. 如果分数中有三个或以上不同的分数,返回其中第三大的分数。

  2. 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。

请你帮小M根据给定的分数数组计算目标分数。


测试样例

样例1:

输入:n = 3,nums = [3, 2, 1]
输出:1

样例2:

输入:n = 2,nums = [1, 2]
输出:2

样例3:

输入:n = 4,nums = [2, 2, 3, 1]
输出:1

1.题目分析:

无序,有重复列表的数据,找出指定排序的元素。可以先做排序,再找出指定元素。

也可以创建一个数组list[first,middle,last],依次比较和替换,最后取出last的元素。

条件分支:判断元素数量(n),取出对应的下标。

2.实现

2.1先排序后取数

通过Set去重,排序可以用Array.prototype.sort方法

function getUniqList<T>(list:T[]):T[] {
    return Array.from(new Set(list));
}

function solution(n: number, nums: number[]): number {
    const list = getUniqList(nums).sort((prev,next) => next-prev);
    return n >2 ? list[2] : list[0]
}

function main() {
    console.log(solution(3, [3, 2, 1]) === 1);
    console.log(solution(2, [1, 2]) === 2);
    console.log(solution(4, [2, 2, 3, 1]) === 1);
}

main();

2.2遍历取数

主要的思路是:

创建一个有序的array [max,middle,min]

判断当前遍历的num

1.如果num大于max,middle变为max,num变为max

2.如果num小于max大于middle,middle变为min,num变为middle

3.如果num小于middle大于min,min变为num

根据n,走取数的逻辑

function sort(list: number[]): number[] {
  let [max, middle, min] = [-Infinity, -Infinity, -Infinity];
  list.forEach((num) => {
    if (num > max) {
      min = middle;
      middle = max;
      max = num;
    } else if (num > middle && num < max) {
      min = middle;
      middle = num;
    } else if (num > min && num < middle) {
      min = num;
    }
  });
  return [max, middle, min];
}

function solution(n: number, nums: number[]): number {
  const target = sort(nums);

  return n > 2 ? target[2] : target[0];
}

function main() {
  console.log(solution(3, [3, 2, 1]) === 1);
  console.log(solution(2, [1, 2]) === 2);
  console.log(solution(4, [2, 2, 3, 1]) === 1);
}

main();