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.

解题思路

这道题一般会有两种思路:一是把输入的整数转化为字符串,再进行字符串倒转操作;二是对输入的整数每次对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),因此对于负数来说,上述代码也是正确的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值