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

Java数组相邻元素乘积最大值计算:含负数数组输出异常排查

问题排查与解决

我来帮你梳理下代码里的问题,这些点导致了负数数组场景下的错误输出:

核心问题分析

1. 最大值初始值设置错误

你把maxsofar初始化为0,但如果数组中所有相邻元素的乘积都是负数,0会比所有负数都大,最终程序会错误地返回0,而不是实际的最大乘积(比如所有乘积里最接近0的负数)。

2. 循环逻辑存在死循环隐患

你的x++语句写在了while循环的大括号外面,这意味着循环体内永远不会更新x的值,x始终为0,循环条件x < inputArray.length -1永远成立,程序会陷入死循环。你提到普通数组能运行,应该是粘贴代码时的格式失误,正确写法必须把x++放到循环体内部。

3. 整数溢出风险

inputArray[x] * inputArray[x+1]用int类型存储时,如果两个绝对值较大的整数相乘(比如Integer.MAX_VALUE * 2或者-100000 * -100000),会触发整数溢出,导致计算结果完全错误,应该用long类型来存储乘积。

修正后的代码

public static void main(String args[]) {
    int[] inputArray = {-5, 8, -9, 1, -5, 4};
    
    // 处理数组长度不足2的边界情况,避免数组越界
    if (inputArray.length < 2) {
        System.out.println("数组长度至少为2才能计算相邻元素乘积");
        return;
    }
    
    int x = 0;
    // 初始化为第一组相邻元素的乘积,彻底避免0对负数场景的干扰
    long maxsofar = (long) inputArray[x] * inputArray[x + 1];
    x++; // 先移动索引,因为已经计算了第一组
    
    while (x < inputArray.length - 1) {
        // 强制转换为long计算,防止整数溢出
        long currentmax = (long) inputArray[x] * inputArray[x + 1];
        // 用Math.max更直观,也可以保留三元运算符
        maxsofar = Math.max(maxsofar, currentmax);
        x++; // 循环内更新索引,确保循环能正常终止
    }
    
    System.out.println(maxsofar);
}

测试验证

针对你提供的数组{-5, 8, -9, 1, -5, 4},相邻元素的乘积分别是:

  • -5 * 8 = -40
  • 8 * -9 = -72
  • -9 * 1 = -9
  • 1 * -5 = -5
  • -5 * 4 = -20

修正后的代码会正确返回最大的乘积-5,而不是之前的0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:06:57