• 007-leetcode算法实现之整数反转reverse_integer | python&golang实现


    # -- coding: utf-8 --

    """
    给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

    如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

    • 考虑边界
      1.末尾为零的int,反转时删除,末尾连续为0,删至不为0为止
      2.有符号的,符号保持
      3.个位数,直接返回

    示例 1:
    输入:x = 123
    输出:321

    示例 2:
    输入:x = -123
    输出:-321

    示例 3:
    输入:x = 120
    输出:21

    示例 4:
    输入:x = 0
    输出:0
    """

    python

    1.基于字符串和栈实现

    基于字符串处理时,需要注意负数及末尾为0的整数,总体思想:

    • 1.将整数转为字符串
    • 2.通过栈依次出栈数字字符,拼接字符
    • 3.注意:负数处理,末尾为0的处理

    主要处理过程为两个一层循环,时间效率O(n),因为需要通过辅助栈处理,需要增加O(n)空间。

    def reverse_integer(num):
        """
    
        :param num: int
        :return: reverse num
        """
        INT_MIN, INT_MAX = pow(-2, 31), pow(2, 31) - 1
        if not isinstance(num, int):
            return False
    
        if num > INT_MAX or num < INT_MIN:
            return False
    
        num2Str = str(num)
        n = len(num2Str)
        if n == 1 or (n == 2 and num2Str[0] == '-'):
            return num
    
        def reverse_handle(start, end, numstr):
            stack_ = list(numstr)
            newnumstr = ''
            for i in range(start, end):
                newnumstr += stack_.pop()
    
            count_0 = 0
            for i in range(end-start):
                if i != '0':
                    break
                elif i > 0 and newnumstr[i] == '0' and newnumstr[i-1] == '0':
                    count_0 += 1
                    if newnumstr[i+1] != '0':
                        break
                elif i == 0 and newnumstr[i] == '0':
                    count_0 += 1
    
            newnumstr = newnumstr[count_0:]
    
    
            return int(newnumstr)
    
        if n >= 2:
            if num2Str[0] == '-':
                newnum = reverse_handle(1, n, num2Str)
                newnum = -newnum if -newnum >= INT_MIN else False
            else:
                newnum = reverse_handle(0, n, num2Str)
                newnum = newnum if newnum <= INT_MAX else False
            return newnum
    

    2.通过整数取模实现

    主要思想:
    基于十进制整数,通过数学运算获取原整数的每一位,从个位开始获取,根据数位再依次*10,最后获取到反转后的整数,注意输入输出的时候边界判断,另外正数与负数需要注意处理。

    本方法主要操作仅包含一层while循环,时间效率O(n),使用的变量也仅常数级别故空间效率O(1)。

    def reverse_integer(num):
        """
    
        :param num: int32
        :return: int32 reverse
        """
        INT_MIN, INT_MAX = pow(-2, 31), pow(2, 31) - 1
    
        if num == 0:
            return num
        if num < INT_MIN or num > INT_MAX:
            return False
    
        neg_flag = False
        if num < 0:
            neg_flag = True
            num = -num
    
        temp = 0
        while num > 0:
            temp = temp * 10 + num % 10 # 获取余数
            num = num // 10 # 获取数位
        if neg_flag:
            temp = -temp
    
        if temp < INT_MIN or temp > INT_MAX:
            return False
    
        return temp
    
  • 相关阅读:
    Python 之 raw_input()与input()区别
    Python基础语法
    在Cloudera Hadoop CDH上安装R及RHadoop(rhdfs、rmr2、rhbase、RHive)
    MapReduce 过程详解
    Cloudera Manager and CDH安装及配置
    RFC 目录
    聊一聊 tcp拥塞控制 九 fack
    聊一聊tcp 拥塞控制 八 相关数据结构&& 概念
    聊一聊 tcp 拥塞控制 七 转载
    udp connected socket
  • 原文地址:https://www.cnblogs.com/davis12/p/15352201.html
Copyright © 2020-2023  润新知