1. 程式人生 > >用python手刃Leetcode(7):反轉整數【簡單題】

用python手刃Leetcode(7):反轉整數【簡單題】

前言

部落格裡新開一個“用python手刃Leetcode”的專題,顧名思義,主要目的是記錄自己在Leetcode上刷題的過程,程式碼全程用python3編寫,所用網址是:leetcode中國。這個網址的好處是:1)純中文,解決了英語不好讀題困難的問題;2)網頁開啟速度快。
`
同時可以看到:目前官網給出的解題程式碼是用java編寫的,並沒有給出官方的python解答,本專欄除了儘量使用多種解法給出每道題的python3解答程式碼之外,還會記錄下自己在做題過程中的一些收穫和思考。便於以後複習查閱。

題目

給定一個 32 位有符號整數,將整數中的數字進行反轉。

示例 1: 輸入: 123 輸出: 321

示例 2: 輸入: -123 輸出: -321

示例 3: 輸入: 120 輸出: 21

注意:假設我們的環境只能儲存 32 位有符號整數,其數值範圍是[231,2311]。根據這個假設,如果反轉後的整數溢位,則返回 0。

題目分析

拿到這道題,首先想到的解題思路是:對輸入數字進行乘除和取餘運算,並把輸出值乘以10後與每次取餘的結果相加,直到原資料變為0。

另外,題目明確提出要對輸出的整數進行限制,所以在返回時需要加上判斷條件。

方法一:
class Solution:
    def reverse(self, x)
:
R = 0 #返回值 flag = 1 #標記輸入值的正負 if x<0: x = abs(x) flag = -1 #輸入是負數 while x != 0: R = R*10+x%10 x = x//10 if -2147483647<R< 2147483648:#判斷是否越界 return R*flag else: return 0

【開始的想法是先把每一位上的數字都存放在數組裡,但是這樣再重新組合成數字的時候會提高程式的時間複雜度,故而捨棄。】
以上程式碼提交後,發現自己的時間複雜度都沒有達到正態分佈的峰值。
這裡寫圖片描述

像我這麼精益求精的人怎麼能容忍這種結果呢,果斷優化程式碼,換另一種思路:

方法二:python切片的騷操作。

這個思路的關鍵語句就是利用R = X[::-1]這種方法對X(X必須是字串)進行一個反轉複製的操作。

不得不說,在python語言中,要想提高程式的執行速度,靈活利用python的切片是一個不錯的思路。

class Solution:
    def reverse(self, x):
        flag = 1
        if x < 0:
            flag = -1
            x = -x
        R = str(x)[::-1]
        R = int(R)
        if R> 2147483647 or R < -2147483648:
            R = 0
        return R*flag

好了,不僅成功縮短了程式執行時間,而且大大縮短了程式碼長度,完美,收工!

解題收穫:
1、python由於沒有提前定義資料型別所產生的取整問題。

這裡需要注意的一點是:python資料使用前是不用定義資料型別的,所以如果執行x/10操作,就算x是一個整數,返回的也會是一個小數,所以要用到取整函式。

python中取整方法有五種:

①採用整除運算子。 python可能已經考慮到了這個問題,所以專門設計了這樣一個整除運算子 // (更準確地說是和運算中精度最高的那個數字保持同位,見例2,3)。

print(10//3)#輸出3
print(10.0//3)#輸出3.0
print(10//3.0)#依舊輸出3.0
print((-10)//3)#這裡注意:輸出的是-4

②直接切取整數部分。直接用內建的 int() 函式即可,對正數和負數都適用:
例如:

print(int(5.20))#返回5
print(int(-5.20))#返回-5

③向上取整。這個需要用到 math 模組中的 ceil() 方法,但要注意負數的返回值:

import math

math.ceil(5.20)#輸出5
math.ceil(-5.20)#這裡需要注意,對於負數來說,其實和方法①效果是一樣的,返回-5

④對數字進行四捨五入用 round() 函式:

print(round(3.11))#返回3 
print(round(3.98))#返回4

⑤高階操作。用 math 模組中的 modf() 方法,分別取小數部分和整數部分,並返回一個元組(先小後整)

 import math
 math.modf(5.20)#返回:(0.20000000000000018, 5.0)這裡小數部分返回一長串是由於計算機精度問題,無需疑惑
2、要注意python中對負數的 % 操作結果。

% 是取餘運算子,正常思維下,對於負數取餘會得到一個負的餘數,比如:(-10)%3 直觀來說應該會得到 1,但是在python中執行後卻得到了2。這點需要注意。

3、flag標誌位使用的小技巧

flag是用來判斷輸入值正負的標誌值。用 11 作為其判斷值,可以在返回時,無需使用if語句,只需要返回數值乘以flag即可,使程式碼更加精簡。