持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
前言
今天继续数组算法题,找出第三大的数字,话不多说,直接看题目
题目描述
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1] 输出:1 解释:第三大的数是 1 。 示例 2:
输入:[1, 2] 输出:2 解释:第三大的数不存在, 所以返回最大的数 2 。 示例 3:
输入:[2, 2, 3, 1] 输出:1 解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。 此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
解题思路
看到题目中的大字我就想到了排序,一般数组问题很常用到的操作就是排序,这题也不例外,先把数组排序之后倒叙来循环数组即可找到第三大的数,但这里面有几个要特别注意的点,如下:
注意:以下所说的注意的点都是在数组排序后的情况下
- 首先是如果输入数组的长度小于3,那直接返回数组的最后一项即可
- 如果数组的长度大于3,那么就要从尾部开始循环数组了,然后用count来记录循环了几次,在循环过程中又分为两种情况,相邻项相同的情况和不同的情况,若果是相同项,那么就接着循环,count值不变,如果是不同项则复制给result,count++。
- 当循环结束之后还要注意一点,那就是count的值是否小于3,如果小于3说明没有第三大的(比如[5,4,4,4,4]);这时候只需返回数组的最后一项即可,如果大于3那返回result即可
代码如下:
/**
* @param {number[]} nums
* @return {number}
*/
var thirdMax = function(nums) {
let result = null //这里要特别注意,不要设置为0,因为数组中可能包含0,如果设置为0循环中的if判断会出现一下错误
let count = 0
nums = nums.sort((a,b)=>a-b)
if(nums.length<3){
return nums[nums.length-1]
}
for(let i=nums.length-1;i>=0;i--){
if(count<3){
if(nums[i]!==result){
result = nums[i]
count++
}
}
}
if(count<3){
return nums[nums.length-1]
}else{
return result
}
};
运行结果如下图:
总结
数组问题常用操作就是排序,遍历,当拿到数组没思路的时候不妨试试这两种方法看会不会出现什么思路。