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

LeetCode四数之和测试用例求和异常:为何输出-294967296?

四数之和溢出问题解析

为什么溢出不报错反而得到-294967296?

Java里的int是32位有符号整数,最大值是2147483647,四个1000000000相加得4000000000,远超这个上限。Java对整数溢出的处理是静默截断——直接丢掉超出32位的部分,只保留低32位数值,不会抛出任何异常。

具体计算:4000000000减去2的32次方(4294967296),结果就是-294967296,这就是你看到的异常值。

你的代码问题所在

  1. sum用int存储必然溢出:四个大数相加的结果根本存不下,导致sum值失真,和target的比较完全错误。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:47:42