7

思路

这道题说起来贼简单, 思路倒没什么思路, 就是把数字一个一个剥离下来然后逆序还原就行了.

实现

看上去简单我却提交了三次才AC. 这里面其实关于int越界的情况的坑很多, 就比如输入的结果是一个10位的int, 倒过来就会越界, 此时要特别小心, 按题目的意思应该返回0.

提交

前两次都爆炸, 第一次由于我用了绝对值函数, 碰到输入是最大负整数的情况就炸了, 第二次是我实现中说的, 碰到一个刚开始可以, 倒过来越界的, 又炸了...

代码

public class Solution {
    public int reverse(int x) {
        if(x == -2147483648)    return 0;

        boolean isNegative = x < 0;
        x = Math.abs(x);

        long[] queue = new long[32];
        int start = 0, end = 0;
        while (x != 0){
            queue[end++] = x % 10;
            x /= 10;
        }

        long re = 0;
        while (start < end){
            re = re * 10 + queue[start++];
        }

        if(isNegative){
            re = re > 2147483648l ? 0 : -re;
        }else{
            re = re > 2147483647l ? 0 : re;
        }
        return (int)re;
    }
}

最佳实现

这里其实完全可以省略这个简易的queue, 另外正负号其实不用分开进行讨论, 完全可以合在一起讨论, 另外检查越界的情况可以用运算还原检查值是否相等来判断. 网上看到最优雅的实现是这个 :

public int reverse(int x)
{
    int result = 0;

    while (x != 0)
    {
        int tail = x % 10;
        int newResult = result * 10 + tail;
        if ((newResult - tail) / 10 != result)
            return 0;
        result = newResult;
        x = x / 10;
    }

    return result;
}

这种解法稍微在越界问题上会产生误导, 建议看一下第8题.

原文地址:https://www.cnblogs.com/nzhl/p/6220713.html