我有 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
提交
取消