LeetCode之Reverse Integer

  • 问题描述
    Given a 32-bit signed integer, reverse digits of an integer.
  • 示例

     Input: 123
     Output: 321
     Input: -123
     Output: -321
     Input: 120
     Output: 21
    
  • 注意
    Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31, 2^31 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
    假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0
  • 解决:

    1. 将int转为str,如果小于0,从字符串索引1开始存入列表中,大于0,从索引0开始存入列表,如果能被10整除,从列表倒数第二个元素开始,每个元素转为int,再与对应的10的幂相乘,累加。这段代码比较low,代码量较大,没有用到Python语言的特点。

      class Solution:
          def reverse(self, x: int) -> int:
              str_x = str(x)
              list_x = []
              if x < 0:
                  for i in range(1, len(str_x)):
                      list_x.append(str_x[i])
              else:
                  for i in range(len(str_x)):
                      list_x.append(str_x[i])
              number = 0
              if x%10 == 0:
                  for j in range(len(list_x)-2, -1, -1):
                      number += int(list_x[j]) * (10 ** j)
              else:
                  for j in range(len(list_x)-1, -1, -1):
                      number += int(list_x[j]) * (10 ** j)
                      # print(number)
              if x < 0:
                  number = number - 2*number
              if number >= 2 ** 31 or number < (-2 ** 31):
                  number = 0
              return number
          
    2. 与上面的思路一致,不过利用了Python的一些操作

      class Solution:
      def reverse(self, x):
          """
          :type x: int
          :rtype: int
          """
          if x==0:
              return 0
          str_x = str(x)
          x = ''
          if str_x[0] == '-':
              x += '-'
          x += str_x[len(str_x)-1::-1].lstrip("0").rstrip("-")
          # Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以可以直接强制转化,其他语言两个数相加会溢出,变成负数
          x = int(x)
          if -2**31 < x < 2**31-1:
              return x
          return 0
      
    3. 官方解法。循环,对给定的int数先对10取余,再除以10,直到除以10为0为止。反转后的数开始为0,每次乘10再加上每次取余后的结果,最终就是反转的结果。但是乘10加上取余结果可能会造成溢出问题。进行判断:图片描述

      class Solution:
      def reverse(self, x: int) -> int:
          rev = 0
          flag = 1
          if x < 0:
              x = abs(x)
              flag = -1
          while x != 0:
              pop = x % 10
              x = x // 10
              if (rev > (2**31-1) // 10) or (rev == (2**31-1) // 10 and pop > 7):
                  return 0
              if (rev < (-2**31) // 10) or (rev == (-2**31) // 10 and pop < -8):
                  return 0
              rev = rev * 10 + pop
          return rev * flag
    • 注:Python中负数取余

      -123%10 = -123 - 10 * (-123 // 10) = -123 - 10 * (-13) = 7
      

einherjar
32 声望9 粉丝

练好基本功,方能打开任督二脉。