题目
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.
解题思路
这道题一般会有两种思路:一是把输入的整数转化为字符串,再进行字符串倒转操作;二是对输入的整数每次对10进行取模,依次取出从最低位到最高位的数字,每次相加时,先把之前得到的结果 ×10 后再加上当前的数字,最终得到倒转的整数。
如果用第一种方法,对于末尾是 0
的整数(比如 1000100
)的倒转操作比较麻烦,并且在判断倒转后的数是否溢出时也比较麻烦(如 2047483649
倒转后是 9463847402
,超出了32位整数所能表示的范围),因此考虑用第二种方法。第二种方法可以自动忽略掉整数末尾的 0
,但是仍然要处理倒转后溢出的问题。
我自己在答题的时候踩过的坑就是:判断溢出不能仅仅依靠符号的改变(比如正数加了一个正数后变成负数),有些过大的正数溢出以后也会变成正数,比如 int
类型的 9452457836
程序输出后得到 862523244
。解决这个问题的方法是,把一个数进行某个操作后得到一个结果,把这个结果进行逆操作后如果能够恢复到原来的数,说明这个操作没有溢出。
Java代码实现
class Solution {
public int reverse(int x) {
int rst = 0;
while (x != 0) {
// 先用临时变量tmp保存运算后的结果
int tmp = rst * 10 + x % 10;
// 当结果进行逆操作后无法恢复,说明已经溢出
if (tmp / 10 != rst)
return 0;
rst = tmp;
x /= 10;
}
return rst;
}
}
另外需要提醒自己的就是负数取模以后还是得到负数,比如 (-48 % 10 == -8)
,因此对于负数来说,上述代码也是正确的。