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
原文地址:https://www.cnblogs.com/davis12/p/15352201.html