Given a 32-bit signed integer, reverse digits of an integer.
Example 1:
Input: 123 Output: 321
Example 2:
Input: -123 Output: -321
Example 3:
Input: 120 Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
题意就是要我们把整数逆序,需要注意当逆序之后超出int表示范围时,返回0。所以我们用double来保存逆序之后的整数,将其和INT_MAX比较,如果大于INT_MAX,则输出0。 完整代码如下:
class Solution {
public:
int reverse(int x)
{
unsigned int y = (x > 0) ? x : -x;
double ans = 0;
while (y) {
ans = ans * 10 + (y % 10);
y = y / 10;
}
if (ans > INT_MAX)
return 0;
return x < 0 ? -ans : ans;
}
};
本代码提交AC,用时8MS。
二刷。如果不用double存储的话,该怎么办?难就难在如何处理越界的问题。我们可以在计算y的过程中判断y是否越界,代码如下。
如果tmp=y*10+reminder>INT_MAX,有两种情况。一种情况是y*10本身就已经>INT_MAX了,此时即y>INT_MAX/10。另一种情况是y*10没>INT_MAX,是加上reminder之后大于的,由于INT_MAX=2147483647,所以如果reminder>7的话,y*10+reminder就会大于INT_MAX。INT_MIN的情况类似。另外,负数的余数也是负数,所以正负数的情况可以合并考虑。
class Solution {
public:
int reverse(int x) {
int y = 0;
while (x != 0) {
int reminder = x % 10;
x /= 10;
if (y > INT_MAX / 10 || (y == INT_MAX / 10 && reminder > 7))return 0;
if (y < INT_MIN / 10 || (y == INT_MIN / 10 && reminder < -8))return 0;
y = y * 10 + reminder;
}
return y;
}
};
本代码提交AC,用时4MS。
Pingback: LeetCode Palindrome Number | bitJoy > code
Pingback: LeetCode String to Integer (atoi) | bitJoy > code