384,整数反转

想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注
在这里插入图片描述

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


示例 1:

输入: 123

输出: 321


示例 2:

输入: -123

输出: -321


示例 3:

输入: 120

输出: 21


问题分析


看到这道题可能我们最容易想到的是先把他转化为一个字符串,然后再进行反转,代码如下

public int reverse(int x) {
    boolean negative = x < 0;
    StringBuilder stringBuilder = new StringBuilder(x + "");
    if (negative)
        stringBuilder.deleteCharAt(0);
    stringBuilder.reverse();
    long reverseDigit = Long.parseLong(stringBuilder.toString());
    if (reverseDigit > Integer.MAX_VALUE || reverseDigit < Integer.MIN_VALUE)
        return 0;
    if (negative)
        return (int) -reverseDigit;
    return (int) reverseDigit;
}

第3行是先把他转化为字符串;

第6行再对字符串进行反转;

第8-9行如果反转之后大于int表示的范围就返回0;

第10-11行是对符号的处理;


这种也能实现,但效率实在是太低。下面我们就以数字1234为例画个图来看一下,如果不转化为字符串该怎么实现

在这里插入图片描述

我们看到上一步的结果在下一步都会先乘以10,然后在加一个个位数就是当前的值,一直这样循环下去,直到全部反转为止。大家可能会怀疑,上面图中分析的是正数,如果是负数该怎么办,其实负数也是一样,大家可以自己画个图看一下。上面的图很容易理解,我们来看下代码

public int reverse(int x) {
    long res = 0;
    while (x != 0) {
        res = res * 10 + x % 10;
        x /= 10;
    }
    return (int) res == res ? (int) res : 0;
}

注意这里的res是long类型,在第7行的时候,会把它转化为int类型,如果res的范围大于int类型表示的范围,转化之后是不相等的,直接返回0,如果在int类型表示的范围内,转化之后是相等的,返回转化后的值即可。

在这里插入图片描述

posted @ 2020-09-24 21:53  数据结构和算法  阅读(73)  评论(0编辑  收藏  举报