7.整数反转-java实现

2020-08-14  本文已影响0人  ontheway_sh

第7题:整数反转

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

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

V1版本

V1版本简单暴力,将整数反转到list中,在按位累加,不过效率是硬伤,代码如下

public int reverse(int x) {
        // 1位数反转就是自己
        if (x > -10 && x < 10) {
            return x;
        }
        // 会浪费空间
        List<Integer> list = new ArrayList<>(32);
        while (x != 0) {
            list.add(x % 10);
            x /= 10;
        }
        // 用long类型来接收
        long result = 0;
        for (int i = list.size() - 1, j = 0; i >= 0; i--,j++) {
            result += list.get(i) * Math.pow(10, j);
        }
        // 超过long类型的边界则返回0
        if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
            return 0;
        }
        return (int) result;
    }

结果也是不出所料


image.png

V2版本

V1版本用list保存本身就很浪费空间,这个版本想办法将list去掉
其实也不需要用list保存,直接用结果集保存就行了
例:123
第一次获取到第一位 3
将 3加入result,result = 3
第二次获取第二位 2
将 3 * 10 + 2 = 32
第三次将32 * 10 + 1 = 321
反转结束,代码如下

public int reverse(int x) {
        // 1位数反转就是自己
        if (x > -10 && x < 10) {
            return x;
        }
        // 用long类型来接收
        long result = 0;
        while (x != 0) {
            result = result * 10 + (x % 10);
            x /= 10;
        }
        // 超过long类型的边界则返回0
        if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
            return 0;
        }
        return (int) result;
    }
image.png

V3版本

V3版本参考官文的 ##弹出和推入数字 & 溢出前进行检查##
返回还是用int接收,不过要提交判断是否溢出,代码如下

public int reverse(int x) {
        // 1位数反转就是自己
        if (x > -10 && x < 10) {
            return x;
        }
        int result = 0;
        int num;
        while (x != 0) {
            num = x % 10;
            // 检查是否会越界
            if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && num > 7)) {
                return 0;
            }
            if (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && num < -8)) {
                return 0;
            }
            result = result * 10 + num;
            x /= 10;
        }
        return result;
    }
image.png

执行结果也是1ms,不过在循环中加了两个if判断感觉和v2版本的总体评分应该也差不多

上一篇 下一篇

猜你喜欢

热点阅读