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?由于正溢出总是循环到最小值,负溢出总是循环到最大值。这是如何检查溢出的?我很乐意对此作出任何澄清。
答案 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
所以回答顶级问题:
为什么“反转”操作,并将其与之前的结果进行比较,成功检查溢出?
因为发生溢出时,“反转”这一系列操作不会让你回到输入值。