Leetcode之7-整数反转(Reverse Integer)

作者: 北京程序猿 | 来源:发表于2019-04-07 00:23 被阅读7次

    前言

    个人网站

    公众号: 北京程序猿, 网站 : https://yaml.vip

    算法题

    题干

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

    示例

    示例 1:
    输入: 123
    输出: 321
    
    示例 2:
    输入: -123
    输出: -321
    
    示例 3:
    输入: 120
    输出: 21
    

    注意

    假设我们的环境只能存储得下32位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回0。

    Java代码

    解法1

    public int reverse(int x) {
        final int RADIX_TEN = 10;
        while (x != 0 && x % RADIX_TEN == 0) {
            x /= RADIX_TEN;
        }
        boolean negative = x < 0;
        String y = negative ? String.valueOf(-x) : String.valueOf(x);
        int i = 0, j = y.length() - 1;
        char[] yChar = y.toCharArray();
        while (i < j) {
            char temp = yChar[i];
            yChar[i] = yChar[j];
            yChar[j] = temp;
            i++;
            j--;
        }
        String data = new String(yChar);
        try {
            return Integer.parseInt(negative ? "-" + data : data);
        } catch (final NumberFormatException e) {
            return 0;
        }
    }
    

    说明

    解法1比较容易想到, 双指针首尾进行交换。不过本道题需要注意溢出问题以及原整数末位是0的情况。

    代码解析

    1. 第3-5行代码是将原整数末尾0去除, 对应示例3。
    2. 6-7行代码是考虑负数这种case。
    3. 最后6行代码抛出异常是基于整数溢出问题的考虑。

    解法2

    public int reverseAnother(int x) {
        int ret = 0;
        while (x != 0) {
            int temp = ret * 10 + x % 10;
            if (temp / 10 != ret) {
            return 0;
            }
            ret = temp;
            x /= 10;
        }
        return ret;
    }
    

    说明

    开始是没想到这种解法, 在看leetcode评论时发现的。 仔细考虑这种算法, 其实是基于正常反转整数的思路整理出来的。

    代码解析

    1. ret变量表示旧的反转中间值。
    2. temp表示新的翻转中间值。
    3. 依次提取x的末位加入temp, 如果发生溢出则通过temp/10无法得到上一轮的翻转结果ret。

    本文著作权归作者所有。

    商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!

    作者:北京程序猿

    链接:整数反转

    相关文章

      网友评论

        本文标题:Leetcode之7-整数反转(Reverse Integer)

        本文链接:https://www.haomeiwen.com/subject/swiliqtx.html