zoukankan      html  css  js  c++  java
  • 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题.

  • 相关阅读:
    Day 15 模块
    Day 14 三元运算符,列表推导式,内置函数
    Day 13 可迭代对象,迭代器对象,for循环迭代,生成器对象,枚举对象
    Day 12 开放封闭原则,装饰器初识
    Day 11 函数对象,函数嵌套,作用域,闭包
    Day 10 函数的形参,实参
    Day 09 函数基础
    Day 08 文件操作模式,文件复制,游标
    HTTP协议
    11,.JS-DOM价绍
  • 原文地址:https://www.cnblogs.com/nzhl/p/6220713.html
Copyright © 2011-2022 走看看