[英]LeetCode 7: Reverse Integer | why does it work with a long but not with an int?
[英]Reverse Integer leetcode: Why does overflow occur only if 7 or greater is added to INT_MAX?
我有Leetcode提供的解决方案,而令我感到困惑的部分是,在Integer.MAX_VALUE中添加7(或更低的值)或在Integer.MIN_VALUE中添加-8(或更低的值)不会导致上溢或下溢分别。
我的逻辑是,如果您具有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;
}
}
是的,通常向Integer.MAX_VALUE
加1会导致溢出,也会从Integer.MIN_VALUE
减去1。 但这不是这里发生的事情。
此代码执行的整数除以10
,这会将任何小数部分都截断。 将Integer.MAX_VALUE
( 2147483647
)除以10时,该代码预期将乘以10并加下一位。 该商为214748364
,乘以10
为2147483640
,并且可以加上另外的7而不会溢出。 类似地,在负方面,将Integer.MAX_VALUE
( -2147483648
)除以10将产生-214748364
,再乘以10将产生-2147483640
,并且可以加上另一个-8
而不会溢出。
该代码考虑了Integer
值范围的极值的最后一位,并小心地避免了溢出。
Integer.MAX_VALUE
是2147483647
这意味着: Integer.MAX_VALUE/10
为214748364
您将要做: rev = rev * 10 + pop
因此,如果rev > 214748364
,则rev * 10
将导致溢出。
或者,如果rev == 214748364
,则rev * 10
为2147483640
,如果pop > 7
,则rev * 10
rev * 10 + pop
将导致溢出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.