一、寫在前面
之前寫過的Leetcode筆記:點擊查看
今天給大家分享的是LeetCode 009:整數反轉,爲面試而生,期待你的加入。
二、今日題目
判斷一個整數是否是迴文數。
迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
示例:
輸入: 121
輸出: true
輸入: -121
輸出: false
解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。因此它不是一個迴文數。
輸入: 10
輸出: false
解釋: 從右向左讀, 爲 01 。因此它不是一個迴文數。
三、 分析
這個題目看着不怎麼難,思路和上一題有點像,就我的個人認知來說,這個題主要考察點在:對迴文數的認知和遍歷優化上,前者,所謂迴文數,即這個數正着讀和反着讀都是相同的,如,2019102
,反過來還是2019102
;後者,看重方法。
四、解題
- 我的方法:
int
轉變爲str
,然後遍歷字符串(Python裏int是不可迭代的,所以得轉換一下),循環比較首尾是否相等。
# -*- coding: utf-8 -*-
"""
@author = 老表
@date = 2019-08-31
@個人公衆號 : 簡說Python
"""
class Solution:
def isPalindrome(self, x: int) -> bool:
# int 轉變成 str
x = str(x)
# 字符串長度
l = len(x)
# 遍歷比較首尾
for i in range(l):
# 相等繼續往後遍歷
if x[i] == x[l-i-1]:
continue
else:
# 不相等,說明不是迴文數,返回 False
return False
# 順利遍歷結束,則返回True
return True
執行結果:
修改一下,
1、對於負數,肯定不是迴文數,因爲有負號
2、不轉爲str,自己取數逆置,比較
# -*- coding: utf-8 -*-
"""
@author = 老表
@date = 2019-08-31
@個人公衆號 : 簡說Python
"""
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
y = 0
temp = x
# 逆轉數
while temp != 0:
pop = temp % 10 # 取出低位
temp = temp // 10 # 取出剩餘數
y = y * 10 + pop # 重新組裝,低位變成高位
if x != y:
return False
# 相等返回True
return True
- 方法二:通過之前的學習,我們知道,一些top級的代碼都是使用了內置函數的,或者特殊語法,對於這題,我們也可以試試,畢竟迴文數的核心在於:逆置前後相等,關鍵在逆置。
Python裏逆置字符串的方法,除了for遍歷外,最好用的方法就是切片。
str[x:y:n]
str :字符串對象
x :起始位置(可以取到)
y :末尾(結束)位置(取不到)
n :步進(隔多遠取一個數,-1表示從末尾開始取)
例如:
str = "1234"
str[1:3:1]
結果:"23"
str[0:4:2]
結果:"13"
str[::-1]
結果:"4321"
# -*- coding: utf-8 -*-
"""
@author = 老表
@date = 2019-08-31
@個人公衆號 : 簡說Python
"""
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
# 轉變爲字符串,切片逆置,轉變爲整數,比較
if x == int(str(x)[::-1]):
return True
return False
- 提交結果
五、疑惑
自從上次發現Leetcode 提交後可以查看其他解決方案,我每次做完就會看看top級的解決方法,這裏分享給大家。
都用了切片來處理逆置問題,不可否認,這的確比我們自己手動處理要快很多。
六、結語
堅持就完了。