找出排名第三大的分数
问题描述
小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:
如果分数中有三个或以上不同的分数,返回其中第三大的分数。
如果不同的分数只有两个或更少,那么小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();