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
相关产品推荐
相关产品推荐

