计算数组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
相关产品推荐
相关产品推荐

