• 【LeetCode题解】7_反转整数


    【LeetCode题解】7_反转整数

    描述

    给定一个 32 位有符号整数,将整数中的数字进行反转。

    示例 1:

    输入: 123
    输出: 321
    

    示例 2:

    输入: -123
    输出: -321
    

    示例 3:

    输入: 120
    输出: 21
    

    注意:

    假设我们的环境只能存储 32 位有符号整数,其数值范围是 ([-2^{31},\,2^{31} - 1])。根据这个假设,如果反转后的整数溢出,则返回 0。

    方法一

    思路

    输入的整数除以 10 得到商和余数,接着将返回的结果(初始值为 0)乘以 10 加上得到的余数作为新的结果,最后判断结果是否溢出(大于 32 位整数的最大值或者小于 32 位整数的最小值),将商作为新的整数重复上述过程,如果商为 0 则程序结束。

    可以将求整数逆序数的过程想象成两个栈之间的弹出和压入操作。一个整数的每一位数存放在栈的每一格中,最高位存放在栈底,最低位存放在栈顶。将栈 A 的栈顶弹出,压入栈 B 的栈底,重复上述过程直到栈 A 为空,此时就完成了求整数逆序数的功能。实际中,弹出和压入操作并不需要借助真正的栈,可以通过求余(数学运算)实现。

    其实,Python 语言的整数类型的取值范围并不存在限制,因此更不存在所谓的溢出。

    Java 实现

    class Solution {
        public int reverse(int x) {
            long result = 0;
            while (x != 0) {
                result = result * 10 + x % 10;
                x = x / 10;
                if (result < Integer.MIN_VALUE || result > Integer.MAX_VALUE) {
                    return 0;
                }
            }
            return (int) result;
        }
    }
    // Runtime: 23 ms
    // Your runtime beats 77.34 % of java submissions.
    

    复杂度分析:

    • 时间复杂度:(O(log(n)))
    • 空间复杂度:(O(1))

    类似的 Java 实现

    
    class Solution {
    	public int reverse(int x) {
            int ret = 0;
            while (x != 0) {
                int pop = x % 10;
                if (ret > Integer.MAX_VALUE / 10 || (ret == Integer.MAX_VALUE / 10 && pop > 7)) {
                    return 0;
                }
                if (ret < Integer.MIN_VALUE / 10 || (ret == Integer.MIN_VALUE / 10 && pop < -8)) {
                    return 0;
                }
                ret = ret * 10 + pop;
                x = x / 10;
            }
            return ret;
    	}
    }
    // Runtime: 21 ms
    // Your runtime beats 99.21 % of java submissions.
    

    复杂度分析同上。

    Python 实现

    class Solution:
        def reverse(self, x):
            """
            Arguments:
            ----------
            x : int, the value range is [-2147483648, 2147483647]
    
            Return:
            -------
            ret : int, the reverse order number
            """
            rev, a = 0, abs(x)
            while a:
                rev = rev * 10 + a % 10
                a = a // 10
            if x > 0 and rev < 2**31:
                return rev
            elif x < 0 and rev <= 2**31:
                return -rev
            else:
                return 0
            
    # Runtime: 56 ms
    # Your runtime beats 85.51 % of python3 submissions.
    

    复杂度分析同上。

    方法二:转化为求字符串的倒序

    Java 实现

    class Solution {
        public int reverse(int x) {
            if (x == 0) {
                return 0;
            }
    
            boolean isPos = x > 0;
    
            StringBuilder sb = new StringBuilder();
            char[] chars = String.valueOf(x).toCharArray();
            for (int i = chars.length - 1; i >= 0; --i) {
                if (chars[i] == '0' && sb.length() == 0) {
                    continue;
                }
                if (chars[i] == '-') {
                    continue;
                }
                sb.append(chars[i]);
            }
    
            String xStr = null;
            if (isPos) {
                xStr = sb.toString();
            } else {
                xStr = "-" + sb.toString();
            }
    
            int rev;
            try {
                rev = Integer.valueOf(xStr);
            } catch (Exception e) {
                return 0;
            }
            return rev;
        }
    }
    

    复杂度分析:

    • 时间复杂度:(O(log(n)))
    • 空间复杂度:(O(1))

    Python 实现

    class Solution:
        def reverse(self, x):
            """
            Arguments:
            ----------
            x : int, the value range is [-2147483648, 2147483647]
    
            Return:
            -------
            ret : int, the reverse order number
            """
            sign = [1, -1][x < 0]
            rev = sign * int(str(abs(x))[::-1])
            return rev if -2**31 <= rev <= 2**31 - 1 else 0
    
    # Runtime: 76 ms
    # Your runtime beats 42.26 % of python3 submissions.
    

    复杂度分析同上。

  • 相关阅读:
    爬虫(Xpath)——爬tieba.baidu.com
    爬虫(正则)——爬neihan8
    爬虫(cookie)——renren模拟登陆
    爬虫(ProxyHandler)——代理
    爬虫(GET)——handler处理器和自定义opener
    爬虫(AJEX)——豆瓣动态页面
    爬虫(POST)——有道翻译(有bug)
    一次跨域请求出现 OPTIONS 请求的问题及解决方法
    现代JS中的流程控制:详解Callbacks 、Promises 、Async/Await
    nodejs中的子进程,深入解析child_process模块和cluster模块
  • 原文地址:https://www.cnblogs.com/xugenpeng/p/9815330.html
Copyright © 2020-2023  润新知