leetcode 解題:7. 整數反轉 @ 彈出和推入數字 & 溢位前進行檢查

娃哈哈店長發表於2019-12-26

給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。這題難度不大很很適合新手練手。

文章原址:https://boywithacoin.cn/

暴力法:

好像這題也不存在什麼暴力法的,只是用簡單的思路來處理一下:
直接來:

 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 協議》,轉載必須註明作者和本文連結
文章!!首發於我的部落格Stray_Camel(^U^)ノ~YO

相關文章