【LeetCode 简单题】2-用Python做反转整数

声明

今天做了第2个简单题,这是狗生完整刷完的第2道LeetCode题,虽然借鉴了别人的思路,没有完整自己做出来,但是,啊!在此记录一下~

题目

给定一个 32 位有符号整数,将整数中的数字进行反转。

eg1.输入-输出:123 -> 321

eg2.输入-输出:-123 -> -321

eg3.输入-输出:120 -> 21

正文

主要思路是2种。第一种是拆解成字符串处理,第二种是将整数不断除10向下取整得到余数,再乘以10达到逆转整数的目的。以下解法1、2属于第一种,解法3、4属于第二种,文末附上了参考的其他博客链接,侵删哦。

解法1。先取绝对值再强制转换成string,再把string[::-1]逆序输出后强制转换为int得到结果,在根据该整数正负决定返回结果前要不要加负号。

# V 1.0 执行成功
class Solution:
    def reverse(self, x):
        x_string = str(abs(x))
        if x < 2**31:
            rev_x = int(x_string[::-1])
            if x > 0:
                return rev_x
            else:
                return -rev_x

解法2。根据整数正负分开处理,正数直接逆序输出后转换,负数取负号之后的数字逆序输出后转换并在结果上加负号,最后进行范围校验

# V 2.0 能提交
class Solution:
    def reverse(self, x):
        if -10 < x < 10: #个位数直接返回
            return x
        else:
            str_x = str(x) 
            if str_x[0] != '-': # 如果是正数则直接逆序输出后转为int
                str_x = str_x[::-1]
                x = int(str_x)
            else:
                str_x = str_x[1:][::-1] # 如果是负数则取符号之后的数字逆序输出后转为int
                x = int(str_x)
                x = -x
        return x if x > -2147483648 and x < 2147483648 else 0 # 范围校验

解法3。更像是两种方法的结合,一方面利用了字符串取最后1位的便利性,一方面又采用了整数取余重新计算逆序数的思路。先转换成字符串,计算其长度,根据第一个字符是否为‘-’判断正负进入不同判断分支,分支里的逻辑是先用一个for循环从字符串整数最后1位开始乘10,计算完进行范围校验,然后返回

# V 3.0 能提交
class Solution:
    def reverse(self, x):
        str_x = str(x)
        x_len = len(str_x)
        count = 0
        if str_x[0] == '-':
            for i in range(x_len-1):
                count = count * 10 + int(str_x[-1-i]) # 取整数倒数第1+i位
            if count < 2**31:
                return -count
            else:
                return 0
        else:
            for i in range(x_len):
                count = count * 10 + int(str_x[-1-i])
            if count < 2**31-1:
                return count 
            else:
                return 0

解法4。纯数学处理,取余再除以10向下取整,这样可以逆序获取数字的各个位,再迭代乘以10就能计算出逆序数了

# V 4.0 能提交成功
class Solution:
    def reverse(self, x):
        flag = 1 if x >= 0 else -1 # 用flag记录整数正负
        new_x = 0
        abs_x = abs(x)
        while abs_x:
            new_x = new_x*10 + abs_x%10
            abs_x //= 10 # 注意这里用的是取整除//而非/,不然就返回的是12.3(比如输入是123),正确返回结果应该是12
        new_x = flag*new_x
        return new_x if new_x < 2147483648 and new_x >= -2147483648 else 0

引用

解法1 & 解法4:https://blog.csdn.net/coder_orz/article/details/52039990#commentsedit

解法2:https://blog.csdn.net/chenhua1125/article/details/80464642

解法3:https://blog.csdn.net/xiaoxiaoley/article/details/78721071

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/81146451
今日推荐