每日一題:在LeetCode上做python的第二天
整數(shù)反轉(zhuǎn)題目
給出一個(gè) 32 位的有符號整數(shù),你需要將這個(gè)整數(shù)中每位上的數(shù)字進(jìn)行反轉(zhuǎn)。
假設(shè)我們的環(huán)境只能存儲(chǔ)得下 32 位的有符號整數(shù),則其數(shù)值范圍為 [?231, 231 ? 1]。請根據(jù)這個(gè)假設(shè),如果反轉(zhuǎn)后整數(shù)溢出那么就返回 0。
方法一:python暴力反轉(zhuǎn)法
注意的是:1切片的寫法,[:0:-1]中的0表示[begin:stop:step]中的stop,即是不計(jì)的,切片是說從最后一位按-1切至0,不包含下標(biāo)為0,[::-1]同理,省略了開頭結(jié)尾
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
方法二:優(yōu)化解法
我們可以一次構(gòu)建反轉(zhuǎn)整數(shù)的一位數(shù)字。在這樣做的時(shí)候,我們可以預(yù)先檢查向原整數(shù)附加另一位數(shù)字是否會(huì)導(dǎo)致溢出。
反轉(zhuǎn)整數(shù)的方法可以與反轉(zhuǎn)字符串進(jìn)行類比。
我們想重復(fù) “彈出” x 的最后一位數(shù)字,并將它 “推入” 到 res 的后面。最后,res 將與 x 相反。
優(yōu)化解:
時(shí)間復(fù)雜度:O(log(x))O(log(x)),x中大約有 log10(x)log10(x) 位數(shù)字。
空間復(fù)雜度:O(1)O(1)
def reverse_better(
self,
x: int) -> int:
y, res = abs(x), 0
# 則其數(shù)值范圍為 [?2^31, 2^31 ? 1]
boundry = (1<<31) -1 if x>0 else 1<<31
while y != 0:
res = res*10 +y%10#逆序數(shù)的寫法,即x=x*10+y%10,y=y//10,%10是余數(shù),把y的最后一位逐次推到前面
if res > boundry :
return 0
y //=10
return res if x >0 else -res
注:
a << 2
左移動(dòng)運(yùn)算符:運(yùn)算數(shù)的各二進(jìn)位全部左移若干位,由 << 右邊的數(shù)字指定了移動(dòng)的位數(shù),高位丟棄,低位補(bǔ) 0。
輸出結(jié)果 240 ,二進(jìn)制解釋: 1111 0000
a >> 2
右移動(dòng)運(yùn)算符:把 ">>" 左邊的運(yùn)算數(shù)的各二進(jìn)位全部右移若干位,>> 右邊的數(shù)字指定了移動(dòng)的位數(shù)
輸出結(jié)果 15 ,二進(jìn)制解釋: 0000 1111

浙公網(wǎng)安備 33010602011771號