[Leetcode]7. 整数反转

题目描述:
题目难度:简单
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

  • 示例 1:
    输入: 123
    输出: 321
  • 示例 2:
    输入: -123
    输出: -321
  • 示例 3:
    输入: 120
    输出: 21

注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

笨办法:
该题比较简单,解题方法很直观。所谓笨办法,也就是第一反应的解法,没有经过细节的优化。
基本的思路是:记录下整数的正/负符号,对整数取绝对值。从低位到高位逐位左移,通过取余数得到整数的各个位,将各个位存入数组。利用数组中的数字v和索引i,就可以得到反转后的整数的各位。索引i处的数字v,对应反转后的整数位为v*10 **(l-i-1),其中l表示数组的长度。注意:不要忘记把正负符号加回来,以及对超过合法范围的情况的处理。

聪明办法:
参考官方提示,大体的思路基本与前述方法一致。但在细节处理上可以更加简单,比如根本就不需要用到数组。具体的处理步骤如下:

  • 对于整数x,可先取绝对值abs(x),单独记录正负符号op,这样就只需要处理x为正数的情况。
  • 通过以下算式得到反转后的整数ans,ans的初始值为0。
    ans=ans*10+x%10
    x=x//10
    此算式的结束条件是x==0。
  • 单独处理ans超过取值范围的情况,用16进制表示[−2^31, 2^31 − 1]较为方便。
    return ans*op if ans<=0x7FFFFFFF else 0

笨办法:
用时40ms,此方法击败了30%的用户。

class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        s=[]#记录整数的各个位
        op=1 if x>0 else -1#符号
        n=abs(x)
       hi,lo=2**31-1,-2**31
       while n>0:
           s.append(n%10)
           n=n//10
       # 注意符号
       l=len(s)
       res=0
       for i,v in enumerate(s):
           res=res+v*10**(l-i-1)
       res=op*res
       if res>=hi or res<=lo:
           return 0
       return res

聪明的方法:
同时也是简洁的方法,此方法用时36ms,击败了93%的用户。

class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        op=1 if x>0 else -1#符号
        n=abs(x)
        ans=0
        while n>0:
            ans=ans*10+n%10
            n=n//10
        return ans*op if ans<=0x7FFFFFFF else 0

你可能感兴趣的:([Leetcode]7. 整数反转)