leetcode 7. Reverse Integer
题目描述:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.
解题思路:
这题本身不是什么难题,唯一一个难点是如果如何判断溢出。
有几种需要考虑考虑的情况:
- 32 位的整数范围为:-2,147,483648 - 2,147,483,647 。其中 -2,147,483648 取负数还是自身;
- 正数越界并不一定越到负数,还有可能两连跳,直接又越回正数;
- 如果用字符串来处理,就要考虑比较多的情况,如末尾为0的情况;
解法一:猥琐流,直接用 long long,完全不需要考虑越界。用 python 等语言的话也是可以直接无视。
class Solution {
public:
int reverse(int x) {
int src = x >= 0 ? x : -x;
long long target = 0;
while(src > 0) {
target = target*10 + src%10;
src = src/10;
}
unsigned int_max = (1<<31) -1;
if(x >= 0)
return target<int_max ? target : 0;
else
return target<int_max ? -target : 0;
}
};
更简洁的写法:
class Solution {
public:
int reverse(int x) {
long long t = 0;
while(x != 0) {
t = t*10 + x%10;
x = x/10;
}
return t <= int(0x7fffffff) && t >= int(0x80000000) ? t : 0;
}
};
解法二:实时监测流,做反转的同时也在监测是否溢出:
note: 这个做法是在做完这题之后,在stackoverflow上找的做法,思路很好。
class Solution {
public:
int reverse(int x) {
int ret = 0;
while(x != 0) {
int t = ret*10 + x%10;
if((t-x%10)/10 != ret)
return 0;
else
ret = t;
x = x/10;
}
return ret;
}
};
此外,还有诸如基于字符串的解法,看着感觉效率就很低,就不加以验证了。