You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取数组中的第二大数字?已有最大值方法需完善次大值实现

如何实现数组的第二大值获取方法?

Hey,你已经搞定了最大值的方法,这点很棒!不过第二大值的实现确实需要多考虑一些细节,比如数组里全是重复最大值的情况、边界输入(比如数组长度不足),还有初始值设置的合理性,我来给你梳理几个可行的方案:

先优化你的最大值方法(可选但推荐)

你的highestNumber方法目前用固定值-999999初始化最大值,如果数组里全是比这个更小的负数(比如[-1000000, -2000000]),结果就会出错。建议改成用数组第一个元素初始化,同时加上边界校验:

public static int highestNumber(int []array1) {
    // 先处理空数组或null的情况
    if (array1 == null || array1.length == 0) {
        throw new IllegalArgumentException("数组不能为空");
    }
    int max = array1[0];
    for (int i = 1; i < array1.length; i++) {
        if (array1[i] > max) {
            max = array1[i];
        }
    }
    return max;
}

方案一:两次遍历实现第二大值

这是最直观的思路:先找到最大值,再遍历数组找小于最大值的最大数,同时处理边界情况:

public static int secondHighest(int []array1) {
    // 校验数组长度至少为2
    if (array1 == null || array1.length < 2) {
        throw new IllegalArgumentException("数组至少需要包含两个元素");
    }
    
    int highest = highestNumber(array1);
    // 用Integer的最小值初始化,避免数组里全是负数的情况
    int secondHighest = Integer.MIN_VALUE;
    
    for (int num : array1) {
        // 只找比最大值小,但比当前第二大值大的数
        if (num < highest && num > secondHighest) {
            secondHighest = num;
        }
    }
    
    // 处理所有元素都等于最大值的情况(比如[5,5,5])
    if (secondHighest == Integer.MIN_VALUE) {
        throw new IllegalArgumentException("数组中不存在第二大值(所有元素相同)");
    }
    
    return secondHighest;
}

方案二:一次遍历同时找最大值和第二大值(更高效)

如果数组很大,两次遍历会多花一倍时间,我们可以在一次遍历中同时跟踪最大值和第二大值,逻辑稍微复杂一点,但效率更高:

public static int secondHighest(int []array1) {
    if (array1 == null || array1.length < 2) {
        throw new IllegalArgumentException("数组至少需要包含两个元素");
    }
    
    int highest = Integer.MIN_VALUE;
    int secondHighest = Integer.MIN_VALUE;
    
    for (int num : array1) {
        if (num > highest) {
            // 当前数比最大值大:把原来的最大值降级为第二大值,更新最大值
            secondHighest = highest;
            highest = num;
        } else if (num < highest && num > secondHighest) {
            // 当前数介于最大值和第二大值之间:更新第二大值
            secondHighest = num;
        }
        // 如果num等于最大值,直接跳过,不做处理
    }
    
    // 同样处理所有元素相同的情况
    if (secondHighest == Integer.MIN_VALUE) {
        throw new IllegalArgumentException("数组中不存在第二大值(所有元素相同)");
    }
    
    return secondHighest;
}

小提示

  • 一定要加上边界校验,避免空数组、长度不足等情况导致的运行时错误;
  • 用Integer.MIN_VALUE代替固定负数初始化,能适配所有整数范围的输入;
  • 如果你的业务场景允许第二大值等于最大值(比如数组[5,5,3],你想返回5),可以把判断条件里的num < highest改成num <= highest,但要注意调整逻辑避免初始值问题。

内容的提问来源于stack exchange,提问作者UnknownJ25

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:57:04