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

整数反转

题目描述:

LeetCode 算法题库【7】——整数反转_第1张图片

解题思路:
  • 第一种:算是暴力法把,也没有什么过多的花里胡哨,这个题目的思路非常明确,也很简单,就是把数字反转,带负号的要保留,如果反转后开头数字是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) # 注意转回整型

LeetCode 算法题库【7】——整数反转_第2张图片

  • 第二种:直接整数反转。这个方法是对第一个方法的优化,因为第一个方法是将整数转换成字符串后反转,这里我们思考如何直接将数字反转,这里就要用到我们数学方面的知识了。通过一系列取余,整除等等,我们可以整数中的数字从后往前依次取出,那么如何使它出现在整数头部呢,这里我们每次取出就乘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

LeetCode 算法题库【7】——整数反转_第3张图片

你可能感兴趣的:(LeetCode,算法学习,字符串,算法,leetcode,数据结构)