LeetCode四数之和测试用例求和异常:为何输出-294967296?
四数之和溢出问题解析
为什么溢出不报错反而得到-294967296?
Java里的int是32位有符号整数,最大值是2147483647,四个1000000000相加得4000000000,远超这个上限。Java对整数溢出的处理是静默截断——直接丢掉超出32位的部分,只保留低32位数值,不会抛出任何异常。
具体计算:4000000000减去2的32次方(4294967296),结果就是-294967296,这就是你看到的异常值。
你的代码问题所在
- sum用int存储必然溢出:四个大数相加的结果根本存不下,导致sum值失真,和target的比较完全错误。
- target的判断逻辑无效:如果target是4000000000这种超出int范围的值,你的代码直接返回空列表,但实际四个数的和就是这个target,只是sum溢出成负数导致匹配失败。
修复后的代码
import java.util.*; class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { HashSet<List<Integer>> ans = new HashSet<>(); Arrays.sort(nums); int n = nums.length; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { int lb = j + 1; int ub = n - 1; while (lb < ub) { // 转成long计算总和,彻底避免溢出 long sum = (long) nums[i] + nums[j] + nums[lb] + nums[ub]; if (sum == target) { ans.add(Arrays.asList(nums[i], nums[j], nums[lb], nums[ub])); lb++; ub--; } else if (sum < target) { lb++; } else { ub--; } } } } return new ArrayList<>(ans); } }
额外提示
- 不用提前判断target是否超出int范围,用long存sum后,哪怕target是更大的数值,也能正确比较。
- 原代码用HashSet去重是可行的,也可以通过跳过重复元素来优化性能,不过这不是当前溢出问题的核心。
内容的提问来源于stack exchange,提问作者skeleg
相关产品推荐
相关产品推荐

