LeetCode 算法题库【7】——整数反转

整数反转

题目描述:

timu

解题思路:
  • 第一种:算是暴力法把,也没有什么过多的花里胡哨,这个题目的思路非常明确,也很简单,就是把数字反转,带负号的要保留,如果反转后开头数字是0则要去除。根据这些所需条件,就很容易能写出代码。
  • 对于反转整数,这里我第一想到了用字符串的方法,将这个数字转成字符串的形式,然后取绝对值将符号去掉(方便反转),用字符串切片的方法,也就是num[::-1],来将字符串反转,从而达到目的。然后,最后要注意最大数字范围,这个在LeetCode题目有提醒到,就是反转后的数字一定要在[-2**31, 2**31 - 1]这个范围内,否则就是溢出,要返回0
  • 这里分享字符串反转的方法。
  • 时间复杂度:O(logx)
class Solution:
    def reverse(self, x: int) -> int:
        number = str(abs(x)) # 转为字符串形式
        num = self.reverse_number(number)
        if -2**31 <= num <= 2**31-1: # 防止溢出
            if x < 0:
                return int(num) * (-1)
            else:
                return int(num)
        else:
            return 0

    def reverse_number(self, num):
        res_num = num[::-1]
        for i in range(len(res_num)):
            if res_num[i] == 0: # 前几位数字为0则去除
                res_num = res_num[1:]
            else: # 直到遇到非0,就break出去
                break
        return int(res_num) # 注意转回整型

1

  • 第二种:直接整数反转。这个方法是对第一个方法的优化,因为第一个方法是将整数转换成字符串后反转,这里我们思考如何直接将数字反转,这里就要用到我们数学方面的知识了。通过一系列取余,整除等等,我们可以整数中的数字从后往前依次取出,那么如何使它出现在整数头部呢,这里我们每次取出就乘10,然后补充下一位,赋给新定义的number,遍历结束我们就成功得到反转的整数啦。然后得到反转整数之后的那些操作就和第一种一样了,判断范围这些。这个方法的速度就会明显比第一种要快一点。
  • 时间复杂度:O(N)
class Solution:
    def reverse(self, x: int) -> int:
        plus = abs(x)
        number = 0
        while plus:
            temp = plus % 10
            number = number*10 + temp
            plus = plus//10
        if -2**31 <= number <= 2**31-1:
            if x > 0:
                return number
            elif x == 0:
                return 0
            else:
                return -number
        else:
            return 0

2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值