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

前言

个人网站

公众号: 北京程序猿, 网站 : 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。

本文著作权归作者所有。

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

作者:北京程序猿

链接:整数反转

    原文作者:北京程序猿
    原文地址: https://www.jianshu.com/p/4d0b1ab58430
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞