LeetCode(7. Reverse Integer)
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
click to show spoilers.
Have you thought about this?
Here are some good questions to ask before coding. Bonus points for you if you have already thought through this!
If the integer's last digit is 0, what should the output be? ie, cases such as 10, 100.
Did you notice that the reversed integer might overflow? Assume the input is a 32-bit integer, then the reverse of 1000000003 overflows. How should you handle such cases?
For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
**Note:
**The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.
知识点:
- 这道题考察了关于C++ int类型的范围以及存储方式。这就要了解数字是如何在计算机存储的了,这涉及到原码,反码和补码的知识。关于这方面的内容,我推荐一篇讲得非常清楚的博客:C++原码,反码,补码详解
不过在实际使用中,我们只需要知道C++ int 的范围位于-232 --- 232-1, 且我们可以用INT_MAX表示int的最大值,用INT_MIN表示int的最小值。 - 关于一个数值是否越界的判断:这里我用到了这样一个小tip,即如果有可能 a + b > INT_MAX的话,为了防止越界造成的麻烦,我们用 a > INT_MAX - b 来判断。其他的运算同理(比如乘法转除法)。这样的等价判断避免了越界带来的麻烦。
解题思路:
这里要注意先判断x是否为INT_MIN,如果是的话,直接返回0,因为INT_MIN的反向数值是越界的;如果不是的话,这样我们就可以把x取绝对值而不用担心取绝对值后x的越界问题,便于我们对数字进行处理。
接下来就是对原来的数字一位一位的取反了,要注意的是在进行到最后一位的时候,要进行越界判断了。此时只要用到我们上面讲到的小tip就可以了。
最后的返回值别忘了正负号就好了。
C++代码如下:
class Solution {
public:
int reverse(int x) {
if (x == INT_MIN)
return 0;
int ans = 0;
bool flag = x<0? true:false;
for (x=flag? -x:x; x>=10; x/=10){
ans = ans*10 + x%10;
}
//check if out of bounds
if (!flag){// positive number
if (INT_MAX / 10 < ans)
return 0;
if (INT_MAX - ans*10 < x)
return 0;
}
else{//negative number
if (-(INT_MIN / 10) < ans)
return 0;
if (INT_MIN + ans*10 > -x )
return 0;
}
//positive or negative process
if (!flag){
ans = ans*10 + x;
return ans;
}
else{
ans = -ans*10 - x;
return ans;
}
}
};