首页 > 解决方案 > Java 整数溢出以及为什么是 Integer.MAX_VALUE / 10?

问题描述

这是来自 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;
    }
}


标签: javaintegeroverflow

解决方案


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)。因此,在乘以 之前rev10我们检查乘以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)。


推荐阅读