題目描述
判斷一個(gè)整數(shù)是否是回文數(shù)古拴∶绻穑回文數(shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù)防楷。
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 校赤。 從右向左讀, 為 121- 躁锡。因此它不是一個(gè)回文數(shù)午绳。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 。因此它不是一個(gè)回文數(shù)映之。
進(jìn)階:
你能不將整數(shù)轉(zhuǎn)為字符串來(lái)解決這個(gè)問(wèn)題嗎拦焚?
解法
對(duì)于輸入的整數(shù) x,如果轉(zhuǎn)為字符串判斷杠输,則只需要判斷 str(x)==str(x)[::-1] 即可赎败。這里不借助字符串判斷,通過(guò)對(duì)整數(shù)進(jìn)行反轉(zhuǎn)抬伺,判斷是否為回文結(jié)構(gòu)螟够。為了避免反轉(zhuǎn) x 后存在整數(shù)溢出,可以只轉(zhuǎn)換 x 的后一半位數(shù)峡钓,將剩下的數(shù)值妓笙,與反轉(zhuǎn)一半的數(shù)值進(jìn)行比較判斷,例如對(duì)于 1221能岩,比較 12 和 12寞宫;對(duì)于12321,比較 12 和 123(奇數(shù)位數(shù)則比較時(shí)去除最后一位)拉鹃。
以 x 表示剩余值辈赋,初始情況為原始輸入值,以 tmp 表示反轉(zhuǎn)后的數(shù)值膏燕,初始為 0钥屈。若輸入整數(shù)為回文結(jié)構(gòu),則剩余 x 值不大于反轉(zhuǎn) tmp 的值時(shí)坝辫,此時(shí)表示反轉(zhuǎn)了輸入整數(shù)的一半位數(shù)篷就。
class Solution:
def isPalindrome(self, x: int) -> bool:
if x<0 or (x%10==0 and x!=0):
return False
if x<10:
return True
tmp=0
while x>tmp:
tmp=tmp*10+x%10
x=x//10
return x==tmp or x==tmp//10
第一個(gè) if 判斷整數(shù)是否為負(fù)數(shù),或是以 0 結(jié)尾的非 0 值近忙;第二個(gè)判斷是否為一位數(shù)字竭业;while 循環(huán)中 tmp 用來(lái)保存反轉(zhuǎn)的后一半數(shù)值,循環(huán)結(jié)束后 x 為剩下的前一半數(shù)值及舍,考慮輸入整數(shù)可能為奇數(shù)位數(shù)未辆,所以增加對(duì) tmp 去除最后一位的比較。