給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。這題難度不大很很適合新手練手。
暴力法:
好像這題也不存在什麼暴力法的,只是用簡單的思路來處理一下:
直接來:
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
執行結果,效果還是 不錯的
Your runtime beats 89.28 % of python3 submissions
Your memory usage beats 99.86 % of python3 submissions (12.8 MB)
最佳化解
我們可以一次構建反轉整數的一位數字。在這樣做的時候,我們可以預先檢查向原整數附加另一位數字是否會導致溢位。
反轉整數的方法可以與反轉字串進行類比。
我們想重複“彈出” x 的最後一位數字,並將它“推入”到 res 的後面。最後,res 將與 x 相反。
最佳化解:
時間複雜度:O(log(x)),x中大約有log10(x) 位數字。
空間複雜度: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
if res > boundry :
return 0
y //=10
return res if x >0 else -res
這題沒有考什麼深的東西,不過可以複習一下python的字元運算語法:
複習一下python的位運算子:
-
(a & b)
按位與運算子:參與運算的兩個值,如果兩個相應位都為1,則該位的結果為1,否則為0
輸出結果 12 ,二進位制解釋: 0000 1100 -
(a | b)
按位或運算子:只要對應的二個二進位有一個為1時,結果位就為1。
輸出結果 61 ,二進位制解釋: 0011 1101 -
(a ^ b)
按位異或運算子:當兩對應的二進位相異時,結果為1
輸出結果 49 ,二進位制解釋: 0011 0001 -
(~a )
按位取反運算子:對資料的每個二進位制位取反,即把1變為0,把0變為1 。~x 類似於 -x-1
輸出結果 -61 ,二進位制解釋: 1100 0011,在一個有符號二進位制數的補碼形式。 -
a << 2
左移動運算子:運算數的各二進位全部左移若干位,由 << 右邊的數字指定了移動的位數,高位丟棄,低位補0。
輸出結果 240 ,二進位制解釋: 1111 0000 -
a >> 2
右移動運算子:把">>"左邊的運算數的各二進位全部右移若干位,>> 右邊的數字指定了移動的位數
輸出結果 15 ,二進位制解釋: 0000 1111
python賦值運算子:
- = 乘法賦值運算子 c = a 等效於 c = c * a
- /= 除法賦值運算子 c /= a 等效於 c = c / a
- %= 取模賦值運算子 c %= a 等效於 c = c % a
- = 冪賦值運算子 c = a 等效於 c = c ** a
- //= 取整除賦值運算子 c //= a 等效於 c = c // a
執行結果:
Your runtime beats 95.84 % of python3 submissions
Your memory usage beats 99.88 % of python3 submissions (12.7 MB)
原始碼儲存在github上,歡迎來提bug哦!-點選訪問
如果覺得不錯請給我一個star謝謝了Stray_Camel(^U^)ノ~YO
本作品採用《CC 協議》,轉載必須註明作者和本文連結