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,导致溢出成为了一个很小的负数,此时这个条件便产生的错误。所以应该分符号进行判断。

posted @ 2015-03-26 16:34  Sprink  阅读(147)  评论(0编辑  收藏  举报