每日一题:在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

浙公网安备 33010602011771号