我有 Leetcode 提供的解决方案,让我感到困惑的是,将 7(或更低的值)添加到 Integer.MAX_VALUE 或将 -8(或更低的值)添加到 Integer.MIN_VALUE 不会导致上溢或下溢分别。我的逻辑是,如果你有 Integer.MAX_VALUE,加 1 会导致溢出。如果你有 Integer.MIN_VALUE,减 1 会导致下溢。我对上溢和下溢的理解哪里错了?class Solution { public int reverse(int x) { int rev = 0; while (x != 0) { int pop = x % 10; x /= 10; if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0; if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0; rev = rev * 10 + pop; } return rev; }}
2 回答

智慧大石
TA贡献1946条经验 获得超3个赞
是的,通常加 1Integer.MAX_VALUE
会导致溢出,从Integer.MIN_VALUE
. 但这不是这里发生的事情。
此代码执行整数除以10
,这会截断任何小数部分。将Integer.MAX_VALUE
( 2147483647
) 除以 10 时,代码预期乘以 10 并添加下一个数字。该商是214748364
,乘以10
是2147483640
,有可能再加上另一个 7 而不会溢出。同样在负数方面,将Integer.MAX_VALUE
( -2147483648
) 除以 10 产生-214748364
,乘以 10 产生,有可能在不溢出的情况-2147483640
下添加另一个。-8
此代码考虑了值范围极值的最后一位,Integer
并小心避免溢出。

拉丁的传说
TA贡献1789条经验 获得超8个赞
Integer.MAX_VALUE
是2147483647
这意味着:Integer.MAX_VALUE/10
是214748364
你将要做:rev = rev * 10 + pop
所以 if rev > 214748364
, thenrev * 10
会导致溢出。
或者 if rev == 214748364
, thenrev * 10
是2147483640
,并且rev * 10 + pop
会导致溢出 if pop > 7
。
添加回答
举报
0/150
提交
取消