LeetCode学习记录第2天:#7 整数反转

LeetCode学习记录第2天:#7 整数反转,第1张

力扣 | 7.整数反转

题目截图

​​​​​​​

方法一:数学法

思路:

利用“%”取模,利用“/”除数。


注意:python默认是浮点算法,所以要加上int()强制转换为整数型。


同时题目要求输入输出的范围都必须是,此处做两次判断。


同时要判断是否为负数。


输入的x为0时和正数情况一致,不做区分。


我分成两个方法。


输入是负数时,先将负数转为正数,然后直接引用正数的方法反转,最后再将其变为负数。


class Solution:
    def reverse(self, x: int) -> int:
        if -2 ** 31 <= x <= 2 ** 31 - 1:
            if x < 0:
                x = -x
                y = (-1) * self.reverse_Positive_number(x)
            else:
                y = self.reverse_Positive_number(x)
        else:
            y = 0

        if -2 ** 31 <= y <= 2 ** 31 - 1:
            pass
        else:
            y = 0

        return y

    def reverse_Positive_number(self, x: int) -> int:
        y = 0
        while x > 0:
            temp = x % 10
            x = int(x / 10)
            y = y * 10 + temp
        return y

代码的优化:

是int型的取值范围,python中没有INT_MIN和INT_MAX,需要手动定义。


直接在代码中写-2 ** 31等数值意义不明,应改为:

INT_MIN, INT_MAX = -2**31, 2**31 - 1
 python中两个斜杠“//”可以表示整除,不一定要使用int()来转换。


python3中取余向下取整数。


python3取模方法如下:

正数直接整除后取除法的余数

-x%y=z

找-x%y = -x- (比-x小的那个可以被y整除的负整数) =-x -(-n*y) ==n*y-x=z的模。


上段代码其实只需要判断返回的y是否在区间就可以了,当然,判断两次也无可厚非。


因为python3给负数取10的模也会返回的结果,可以借此将模减去10,得到一个负数​​​​​​​

如 ,将,再利用,也就是

# Python3 的取模运算在 x 为负数时也会返回 [0, 9) 以内的结果,因此这里需要进行特殊判断
            if x < 0 and digit > 0:
                digit -= 10

最后优化的代码如下:

class Solution:
    def reverse(self, x: int) -> int:
        INT_MIN, INT_MAX = -2**31, 2**31 - 1

        rev = 0
        while x != 0:
            # INT_MIN 也是一个负数,不能写成 rev < INT_MIN // 10
            if rev < INT_MIN // 10 + 1 or rev > INT_MAX // 10:
                return 0
            digit = x % 10
 
            if x < 0 and digit > 0:
                digit -= 10

            x = (x - digit) // 10
            rev = rev * 10 + digit
        
        return rev

或者

class Solution:
    def reverse(self, x: int) -> int:
        INT_MIN, INT_MAX = -2 ** 31, 2 ** 31 - 1
        flag = 1 if x > 0 else -1
        x_positive = abs(x)
        y = 0
        if INT_MIN <= x <= INT_MAX:
            while x_positive > 0:
                temp = x_positive % 10
                x_positive = int(x_positive / 10)
                y = y * 10 + temp
            ret = flag * y
        else:
            ret = 0

        if INT_MIN <= ret <= INT_MAX:
            pass
        else:
            ret = 0
        return ret
方法二:利用字符串取反

设置一个标记flag,若x>0则为1,否则为-1

flag = 1 if x > 0 else -1

让后将int型的x转变为str型,同时反转输出后再强制转变为int型

int(str())

利用abs()去x的绝对值

最后的结果乘以标记flag

ret = flag * int(str(abs(x))[::-1])

最终结果

class Solution:
    def reverse(self, x: int) -> int:
        flag = 1 if x > 0 else -1
        ret = flag * int(str(abs(x))[::-1])
        if abs(ret) > 2 ** 31:
            ret = 0

        ret

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/568471.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存