pythontip 100days-day12

题目

给出一个 32 位的有符号整数,将这个整数中每位上的数字进行反转

例子

  • 123 -> 321
  • -123 -> -321
  • 120 -> 21
  • 0 -> 0

假设

  • 输入的整数范围位于-2^312^31-1范围内

tips

  1. 将整数转化为字符串进后进行处理
  2. 不借助字符串,仅利用除法,取模操作完成

答案

解法1:

def reverse(x):
    if -10 < x < 10:
        return x
    str_x = str(x)
    if str_x[0] != "-":
        str_x = str_x[::-1]
        x = int(str_x)
    else:
        str_x = str_x[:0:-1]
        x = int(str_x)
        x = -x
    return x if -2147483648 < x < 2147483647 else 0     
                                                    

性能

  1. 时间复杂度O(n)
  2. 空间复杂度O(n)

关键点

  1. 转为字符串处理
  2. 考虑溢出的情况

解法2:

def reverse(x):
    y, res = abs(x), 0
    # 则其数值范围为 [−2^31,  2^31 − 1]
    boundry = (1<<31) -1 if x>0 else 1<<31 # 2147483648-1, 2147483648 
    while y != 0:
        res = res*10 +y%10
        if res > boundry :
            return 0
        y //=10
    return res if x >0 else -res
                                                        

性能

  1. 时间复杂度log10(n)
  2. 空间复杂度O(1)

关键点

  1. 利用除法和取模运算
  2. 考虑溢出的情况

解法3:

def reverse_str(x):
    """
    1. 判断x的正负
    2. 提取x每一位数字存储在列表
    3. 然后使用按权值相加
    :param x:
    :return:
    """

    x = str(x)
    flag = True  # 表示正负
    if x[0] == '-':
        flag = False
        x = x[1:]
    x = x[::-1]
    result = int(x)
    if not flag:
        result = -result
    return result

性能

  1. 时间复杂度log10(n)
  2. 空间复杂度O(1)

关键点

  1. 利用字符串实现符号判断和反转