LeetCode刷题记录(三十八):第三大的数

77 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

第三大的数

image.png

题目解析

题目难度:简单

题目素材解析

本题提供的素材只有一个。

  1. 非空的整数数组nums

其内的整数元素就是整型的取值范围。

我的解读

我对这道题的解读,其实有很多个方面,虽然这道题是一道简单类型的。

自我感觉对逻辑的要求还是挺高的。

主要还是来看一下解题思路吧。

解题思路

解题思路有很多种,先来举个例子,比如先对数组进行排序,然后取出前三个值进行比较后返回预期结果。

但是我没有使用这个思路,打算直面这个逻辑来通过一次循环搞定。

第一步,先来声明三个整型变量,分别代表着前三名的数字,并且都赋值第一个整数元素值。

第二步,进入循环体。

循环体内主要分为五个if判断,来解决所有的对比逻辑,并且这些if有着绝对的判断顺序。

  1. 如果当前索引值大于最大值,则顺位后移,第二名的值给第三名,原最大值给第二名。

  2. 如果前者不成立,且第二名的值等于第一名的值,并且当前索引值小于最大值时,则从第二名顺位后移。

  3. 如果前者均不成立,且第三名的值等于第二名的值,并且当前索引值小于第二名的值时,则替换第三名的值。

  4. 如果前者均不成立,且当前索引值小于最大值,并且当前索引值大于第二名的值时,则从第二名顺位后移。

  5. 如果前者均不成立,且当前索引值小于第二名的值,并且当前索引值大于第三名的值时,则替换第三名的值。

以此就能获取出前三名的值。

第三步,对比前三名的值是否有相同的值,如果有则返回最大值,如果没有则返回第三名的值。

代码

public class Test {

    public static void main(String[] args) {
        Test test = new Test();
//        [1,2,2,5,3,5][5,2,4,1,3,6,0]
        System.out.println(test.thirdMax(new int[]{5,2,4,1,3,6,0}));
    }

    public int thirdMax(int[] nums) {
        int max = nums[0];
        int second = nums[0];
        int third = nums[0];
        for (int i = 1; i < nums.length; i++) {
            //找出前三名
            if (nums[i] > max) {
                third = second;
                second = max;
                max = nums[i];
            }else if(second == max && nums[i] < max){
                second = nums[i];
                third = nums[i];
            }else if(third == second && nums[i] < second){
                third = nums[i];
            } else if (nums[i] < max && nums[i] > second) {
                third = second;
                second = nums[i];
            } else if (nums[i] < second && nums[i] > third) {
                third = nums[i];
            }
        }

        if (third == second || third == max || second == max) {
            return max;
        } else {
            return third;
        }
    }


}

执行结果

image.png