每日一题:在LeetCode上做python的第二天

整数反转题目

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

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

方法一:python暴力反转法

注意的是:1切片的写法,[:0:-1]中的0表示[begin:stop:step]中的stop,即是不计的,切片是说从最后一位按-1切至0,不包含下标为0,[::-1]同理,省略了开头结尾

def reverse_force(self, x: int) -> int:
        if -10 < x < 10:
            return x
        str_x = str(x)
        if str_x[0] != "-":
            str_x = str_x[::-1]
            x = int(str_x)
        else:
            str_x = str_x[:0:-1]
            x = int(str_x)
            x = -x
        return x if -2147483648 < x < 2147483647 else 0

  方法二:优化解法

我们可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。
反转整数的方法可以与反转字符串进行类比。

我们想重复 “弹出” x 的最后一位数字,并将它 “推入” 到 res 的后面。最后,res 将与 x 相反。

优化解:
时间复杂度:O(log(x))O(log(x)),x中大约有 log10(x)log10(x) 位数字。
空间复杂度:O(1)O(1)

def reverse_better(
        self, 
        x: int) -> int:
       
        
        y, res = abs(x), 0
        # 则其数值范围为 [−2^31,  2^31 − 1]
        boundry = (1<<31) -1 if x>0 else 1<<31
        while y != 0:
            res = res*10 +y%10#逆序数的写法,即x=x*10+y%10,y=y//10,%10是余数,把y的最后一位逐次推到前面
            if res > boundry :
                return 0
            y //=10
        return res if x >0 else -res  

注:

a << 2
左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补 0。
输出结果 240 ,二进制解释: 1111 0000

a >> 2
右移动运算符:把 ">>" 左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
输出结果 15 ,二进制解释: 0000 1111

posted @ 2020-12-29 00:03  仙子qwq  Views(67)  Comments(0)    收藏  举报