为什么反转操作允许溢出处理?

时间:2017-12-16 20:49:28

标签: java

leetcode问题(https://leetcode.com/problems/reverse-integer/description/)要求反转一个整数,这很简单,但是如果有任何溢出,则希望用户返回0。使用long执行此操作也很简单,因为您可以检查它是否大于java中的INTEGER.MAX_INT或MIN_INT。但如果只允许32位整数,那怎么能实现呢?

显示以下解决方案:

public int reverse(int x)
{
    int result = 0;

    while (x != 0)
    {
        int tail = x % 10;
        int newResult = result * 10 + tail;
        if ((newResult - tail) / 10 != result)
        { return 0; }
        result = newResult;
        x = x / 10;
    }

    return result;
}

我很困惑为什么会这样。为什么“反转”操作,并将其与之前的结果进行比较,成功检查溢出?

如果你从x开始,那么说: x2 =(x * 10)+ b,不会(x2-b)/ 10 总是等于x?由于正溢出总是循环到最小值,负溢出总是循环到最大值。这是如何检查溢出的?我很乐意对此作出任何澄清。

1 个答案:

答案 0 :(得分:1)

  

如果你从x开始,那么说:x2 =(x * 10)+ b,不会(x2-b)/ 10总是等于x?

没有。你对“循环”的直觉对于加法和减法都是正确的 - 就像在12点钟左右在钟面上来回移动一样。

但是,这不适用于乘法,如本示例所示:

int x = 2_000_000_000;
int y = x * 10;
int z = y / 10;

System.out.println(x);   // 2000000000
System.out.println(z);   // -147483648

Live demo.

所以回答顶级问题:

  

为什么“反转”操作,并将其与之前的结果进行比较,成功检查溢出?

因为发生溢出时,“反转”这一系列操作不会让你回到输入值。