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

LeetCode整数反转题添加32位范围校验后提交仍报错

问题原因
  • 溢出判断时机完全错误:Java中int本身就是32位有符号整数,取值范围固定为[-2^31, 2^31-1]。你在循环内执行n = n * 10 + x % 10运算时,如果结果超出int的取值范围,会自动触发溢出截断,得到的是被篡改后的错误值。你等整个循环跑完、溢出已经发生后再判断n的范围,根本检测不到真实的溢出情况。
  • 边界值计算存在隐患:Math.pow()返回值是double类型,浮点数转整数本身就有精度损失风险,也完全没有必要手动计算边界,Java已经内置了Integer.MIN_VALUE、Integer.MAX_VALUE两个常量直接对应32位有符号整数的上下限。
解决方案

把溢出判断提前到每一次更新n之前,先校验本次计算是否会触发溢出,如果会直接返回0,否则再执行计算操作。

修正后的代码如下:

class Solution {
    public int reverse(int x) {
        int n = 0;
        while (x != 0) {
            int digit = x % 10;
            // 提前判断正溢出:如果n已经大于MAX_VALUE/10,乘10必然溢出;等于的话加digit超过7也溢出(MAX_VALUE最后一位是7)
            if (n > Integer.MAX_VALUE / 10 || (n == Integer.MAX_VALUE / 10 && digit > 7)) {
                return 0;
            }
            // 提前判断负溢出:n小于MIN_VALUE/10乘10必然溢出;等于的话digit小于-8也溢出(MIN_VALUE最后一位是-8)
            if (n < Integer.MIN_VALUE / 10 || (n == Integer.MIN_VALUE / 10 && digit < -8)) {
                return 0;
            }
            n = n * 10 + digit;
            x /= 10;
        }
        return n;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:45:00