这是来自Leetcode解决方案的代码。所以我不理解if条件,为什么Integer.MAX_VALUE必须被10整除(Interger.MAX_VALUE / 10)?
谢谢!
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;
}
}
发布于 2019-06-06 07:41:57
reverse(int x)
函数用于反转x
的十进制数字。例如,如果为x = 102
,则返回201
;如果为x = -102
,则返回-201
。
当计算出x
的倒数时,它存储在rev
中。例如,对于x = 102
,rev
采用连续的值2
、20
和201
。
在每次迭代中,rev
与10
相乘,并向其添加一个数字。当然,rev
不能大于Integer.MAX_VALUE
(2147483647
)。因此,在将rev
与10
相乘之前,我们检查将其与10
相乘并添加pop
是否会使其大于Integer.MAX_VALUE
。
我们首先检查rev
是否大于Integer.MAX_VALUE / 10
(214748364
)。如果它大于,则反向整数不存在。如果不是,则rev
小于或等于Integer.MAX_VALUE / 10
。如果它小于Integer.MAX_VALUE / 10
,那么即使我们将它乘以10
,我们也可以向它添加任何数字(pop
),并且我们不会超过Integer.MAX_VALUE
。但是,如果它等于Integer.MAX_VALUE / 10
,那么我们必须确保pop
不是> 7
(2147483647 - 214748364 * 10
),因为否则我们将超过Integer.MAX_VALUE
。
同样的道理也适用于Integer.MIN_VALUE
(2147483648
)。
发布于 2019-06-06 06:03:10
这是非常直接的。添加它的主要目的是为了不会遇到整数内存越界异常。
Line 1: rev == Integer.MAX_VALUE / 10
Line 2: rev = rev * 10 + pop;
让我们假设上面的情况对于某些值是真的。Line 1 means that 10*rev = Integer.MAX_VALUE.
第2行: rev是一个整数。如果按照第1行,我们遇到了rev = Integer.MAX_VALUE,
的情况,如果我们在它上面添加一个pop,我们将遇到整数内存越界异常。为了避免这种情况,添加了第1行。确保执行第1行的示例测试用例是"Pass Integer.MAX_VALUE" as an input to reverse() function.
https://stackoverflow.com/questions/56468515
复制相似问题