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

计算数组n-1元素最小最大和时BigInteger仍溢出的原因与解决

问题原因与解决方法

原因分析

改用BigInteger后仍输出负数的核心问题是总和计算的时机错误:

原代码中sorted.stream().mapToInt(Integer::intValue).sum()这一步先以int类型计算数组总和,当元素总和超过int的最大值(2^31-1 = 2147483647)时,int会直接溢出变成负数。此时再将这个已溢出的负数转为BigInteger,后续的减法计算自然会得到错误的负数结果。

以你提供的输入为例,5个元素总和为3467737930,远大于int最大值,sum()返回的是溢出后的负数,转成BigInteger后数值仍为负,最终输出必然错误。

解决方法

要彻底避免溢出,需全程用BigInteger进行总和计算,跳过int类型的中间求和步骤,直接将每个Integer元素转为BigInteger后累加。

修正后的代码示例:

import java.math.BigInteger;
import java.util.List;
import java.util.Collections;

public static void miniMaxSum(List<Integer> arr) {
    // 直接用BigInteger累加计算数组总和
    BigInteger totalSum = arr.stream()
                            .map(BigInteger::valueOf)
                            .reduce(BigInteger.ZERO, BigInteger::add);
    
    // 获取数组的最小值和最大值
    int minVal = Collections.min(arr);
    int maxVal = Collections.max(arr);
    
    // 计算最小和(总和减最大值)与最大和(总和减最小值)
    BigInteger minSum = totalSum.subtract(BigInteger.valueOf(maxVal));
    BigInteger maxSum = totalSum.subtract(BigInteger.valueOf(minVal));
    
    System.out.println(minSum + " " + maxSum);
}

额外优化说明

原代码中的排序步骤是多余的——我们只需要找到数组的最小值和最大值,就能通过「总和-最大值」得到最小和,「总和-最小值」得到最大和,省去排序的时间开销,效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:13:14