Palindrome Number[LeetCode/Python3/Easy]
題目
給定一個整數 x
,如果x
是Palindrome Number,則返回true
,否則返回false
。
Palindrome Number是指正序(從左到右)和倒序(從右到左)讀都是一樣的整數。
例子 1:
輸入:x = 121
輸出:true
解釋:121從左到右和從右到左讀都是121。
例子 2:
輸入:x = -121
輸出:false
解釋:從左到右讀為-121。從右到左讀為121-。因此它不是回文數。
例子 3:
輸入:x = 10
輸出:false
解釋:從右到左讀為01。因此它不是回文數。
限制:
231 <= x <= 231 - 1
進一步挑戰:
你能不將整數轉為字串來解決這個問題嗎?
我的答案
其實這是我第一個想到的答案
class Solution:
def isPalindrome(self, x: int) -> bool:
if x <0:
return False
String=str(x)
if len(String)==1:
return True
for i in range(len(String)//2):
if String[i] != String[-1-i]:
return False
return True
表現其實還不錯,打敗95.49%的人
這是我嘗試的第二種答案
class Solution:
def isPalindrome(self, x: int) -> bool:
if x <0:
return False
String=str(x)
x_Reversed=int(String[::-1])
if x-x_Reversed == 0:
return True
else:
return False
結果表現反而比較差😂
於是就是尋找原因,結果發現 String[::-1]
的運作方式是複製了原本的 String
,然後在把原本String的內容一個一個反向輸入進去新複製的String,等同以下Code:
new = [None] * len(self)
for i in range(len(self)):
j = len(self) - 1 - i
new[j] = self[i]
這樣等於就是 O(n) 的操作,相比第一個解法,我只loop原始字串的一半,只要有相等就是palindrome number,算是O(n/2)就會比較快一點。
不轉換成字串的答案
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0 or (x > 0 and x%10 == 0):
return False
result=0
while x>result:
result=result*10+x%10
x=x//10
if x==result or x==result//10:
return True
else:
return False
表現沒有比較好耶,怎麼會這樣勒?
複習一下python indices
b = a[i:j] # 表示复制a[i]到a[j-1],以生成新的list对象
a = [0,1,2,3,4,5,6,7,8,9]
b = a[1:3] # [1,2]
# 当i缺省时,默认为0,即 a[:3]相当于 a[0:3]
# 当j缺省时,默认为len(alist), 即a[1:]相当于a[1:10]
# 当i,j都缺省时,a[:]就相当于完整复制一份a
b = a[i:j:s] # 表示:i,j与上面的一样,但s表示步进,缺省为1.
# 所以a[i:j:1]相当于a[i:j]
# 当s<0时,i缺省时,默认为-1. j缺省时,默认为-len(a)-1
# 所以a[::-1]相当于 a[-1:-len(a)-1:-1],也就是从最后一个元素到第一个元素复制一遍,即倒序。
留言
張貼留言