Java Integer溢出和Integer.MAX_VALUE / 10的原因?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (792)

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


提问于
用户回答回答于

reverse(int x)函数反转的十进制数字x。例如,if x = 102,它返回201,如果x = -102返回-201

x计算反向时,将其存储在rev。例如,对于x = 102rev取连续值220201

在每次迭代时,rev乘以10,并向其添加一位数。当然,rev不能大于Integer.MAX_VALUE2147483647)。因此,乘前rev通过10,我们检查是否乘以它10并加入pop将使其大于Integer.MAX_VALUE

我们首先检查是否rev大于Integer.MAX_VALUE / 10214748364)。如果它更大,则不存在反向整数。如果不是,那么rev小于或等于Integer.MAX_VALUE / 10。如果它小于Integer.MAX_VALUE / 10,那么即使我们乘以它10,我们也可以添加任何数字(pop),我们不会超过Integer.MAX_VALUE。但是,如果它等于Integer.MAX_VALUE / 10,那么我们必须确保pop不是> 72147483647 - 214748364 * 10)因为否则我们会超过Integer.MAX_VALUE

同样的推理适用于Integer.MIN_VALUE2147483648)。

用户回答回答于

这很直接。它主要添加,以便您不会超出绑定异常的整数内存。

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.

扫码关注云+社区

领取腾讯云代金券