前言
博客裏新開一個「用python手刃Leetcode」的專題,顧名思義,主要目的是記錄本身在Leetcode上刷題的過程,代碼全程用python3編寫,所用網址是:leetcode中國。這個網址的好處是:1)純中文,解決了英語很差讀題困難的問題;2)網頁打開速度快。 ` 同時能夠看到:目前官網給出的解題代碼是用java編寫的,並無給出官方的python解答,本專欄除了儘可能使用多種解法給出每道題的python3解答代碼以外,還會記錄下本身在作題過程當中的一些收穫和思考。便於之後複習查閱。java
判斷一個整數是不是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是同樣的整數。python
示例 1: 輸入: 121 輸出: truebash
示例 2: 輸入: -121 輸出: false 解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。所以它不是一個迴文數。ui
示例 3: 輸入: 10 輸出: false 解釋: 從右向左讀, 爲 01 。所以它不是一個迴文數。spa
映入腦海的第一個想法固然是將數字轉換爲字符串,並檢查字符串是否爲迴文。.net
class Solution:
def isPalindrome(self, x):
a = str(x)
n = len(a)#元素個數
i = 0
while i<(n//2):
if a[i] != a[n-1-i]:
return False
return True
複製代碼
這裏用了一次循環,在沒有其餘思路的狀況下不失爲一種解決方法。可是,這種方法時間複雜度太長,在這裏無法經過。code
第二種方法固然就要使用python的切片大法了。這裏還詳細分了兩種思路:第一種思路是,我管你數字是多少,直接利用 用python手刃Leetcode(7):反轉整數【簡單題】中提到的字符串反轉切片大法。轉了以後一比較便可。blog
class Solution:
def isPalindrome(self, x):
x = str(x)
return x == x[::-1]
複製代碼
Amazing!兩行代碼解決。leetcode
還有一種思路就是多考慮了一下輸入的數字類型,負數確定不會是迴文數的,直接返回False
便可,因此從源頭控制一下輸入數據,防止作無用的轉換字符串、反轉操做。字符串
class Solution:
def isPalindrome(self, x):
if x < 0:
return False
return int(str(x)[::-1]) == x
複製代碼
雖然代碼多幾行,可是速度卻降下去了。
這個代碼的思路是:由於對於迴文數字,其後半部分反轉後應該與原始數字的前半部分相同。因此只須要截取數字的後半部分並反轉,而後再與前半部分比較便可。雖然思路頗有意思,可是在這裏,相比於上邊兩種方法,代碼長度和時間複雜度都會變長,惟一優勢是會節省一部分空間,姑且在這裏貼出來。
x1 = str(x) #將x轉換成字符串
n = len(x1) #字符串長度
if n == 1: #若是輸入是個位數,直接返回True
return True
else:
x2 = x1[n-n//2:] #截取後半段
if x1[:n//2] == x2[::-1]: #前半段和反轉後的後半段比較
return True
else:
return False
複製代碼
最後,調皮的官網給了一個小進階問題,留待之後解決:
進階: 你能不將整數轉爲字符串來解決這個問題嗎?