LeetCode 之 Reverse Integer
在网上看到有人说,整数类的这类题目,需要注意两点:一是符号问题;二是溢出问题。
题解如下:
1 int reverse(int x) { 2 int res = 0; 3 while(x) 4 { 5 if(x>0) 6 { 7 if(res > (2147483647 - x%10)/10) 8 return 0; 9 } 10 else if(x<0) 11 { 12 if(res < (-2147483648 - x%10)/10) 13 return 0; 14 } 15 res = res*10 + x%10; 16 x /= 10; 17 } 18 return res; 19 }
其中判断溢出的两条if语句很有意思。
首先,是这个条件是在正常32位之内的,如果直接判断res*10 + x%10>2147483647,那么可能本身前面那个式子的值已经溢出了,这个判断本身就不能正确的成立。所以在这里对不等式移项成了判断res > (2147483647 - x%10)/10 , 这样,两边的式子都在32位之间进行的比较,是正常的。
调试的时候还发现 if(res > (2147483647 - x%10)/10 || res < (-2147483648 - x%10)/10)这样写是不对的,因为对于每件中第一个式子来说,本来其意图是判断正数向上溢出的,若此时x是个负值,例如-3,那么第一个式子减去的x%10就是-3,相当于在2147483648的基础上减去了-3,也即加了3,导致溢出成为了一个很小的负数,此时这个条件便产生的错误。所以应该分符号进行判断。