迴文數的五種解法
一、題目描述
題目:9.迴文數
難度:簡單
判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121 輸出: false
解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。因此它不是一個迴文數。
示例 3:
輸入: 10 輸出: false 解釋: 從右向左讀, 爲 01 。因此它不是一個迴文數。
進階:
你能不將整數轉爲字符串來解決這個問題?
二、題目解析
1. 解題思路
五種解法
解題思路: (五種實現方法)
- 轉成字符串:
a. 雙向隊列
b. 雙指針 - 不轉字符串:
a. 模擬字符串的雙向隊列(使用math庫的log函數 獲取整數的位數)
b. 反轉後面一半的整數(使用math庫的log函數 獲取整數的位數)
c. 反轉後面一半的整數(不適用log函數) (通過原整數x 與 reverse_x 的大小判斷)
2. Python實現
class Solution:
# 方法一: 將int轉化成str類型: 雙向隊列
# 複雜度: O(n^2) [每次pop(0)都是O(n)..比較費時]
def isPalindrome(x: int) -> bool:
lst = list(str(x))
while len(lst) > 1:
if lst.pop(0) != lst.pop():
return False
return True
# 方法二: 將int轉化成str類型: 雙指針 (指針的性能一直都挺高的)
# 複雜度: O(n)
def isPalindrome(x: int) -> bool:
lst = list(str(x))
L, R = 0, len(lst)-1
while L <= R:
if lst[L] != lst[R]:
return False
L += 1
R -= 1
return True
# 方法三: 進階:不將整數轉爲字符串來解決: 使用log來計算x的位數
# 複雜度: O(n)
def isPalindrome(self, x: int) -> bool:
"""
模仿上面字符串的方法:分別取'第一位的數'與'第二位的數'對比
(弊端是:頻繁計算,導致速度變慢)(下面的方法三隻反轉一半數字,可以提高性能)
"""
if x < 0:
return False
elif x == 0:
return True
else:
import math
length = int(math.log(x, 10)) + 1
L = length-1
print("l = ", L)
for i in range(length//2):
if x // 10**L != x % 10:
return False
x = (x % 10**L) //10
L -= 2
return True
# 方法四: 進階:不將整數轉爲字符串來解決: 使用log來計算x的位數
# 複雜度: O(n)
def isPalindrome(self, x: int) -> bool:
"""
只反轉後面一半的數字!!(節省一半的時間)
"""
if x < 0 or (x!=0 and x%10==0):
return False
elif x == 0:
return True
else:
import math
length = int(math.log(x, 10)) + 1
reverse_x = 0
for i in range(length//2):
remainder = x % 10
x = x // 10
reverse_x = reverse_x * 10 + remainder
# 當x爲奇數時, 只要滿足 reverse_x == x//10 即可
if reverse_x == x or reverse_x == x//10:
return True
else:
return False
# 方法五: 進階:不將整數轉爲字符串來解決: 不使用log函數
# 複雜度: O(n)
def isPalindrome(self, x: int) -> bool:
"""
只反轉後面一半的數字!!(節省一半的時間)
"""
if x < 0 or (x!=0 and x%10==0):
return False
elif x == 0:
return True
else:
reverse_x = 0
while x > reverse_x:
remainder = x % 10
reverse_x = reverse_x * 10 + remainder
x = x // 10
# 當x爲奇數時, 只要滿足 reverse_x//10 == x 即可
if reverse_x == x or reverse_x//10 == x:
return True
else:
return False
x = 10
x = 10001
print(Solution().isPalindrome(x))
碼字不易,歡迎點贊,關注,精彩不斷,好題連連~~~
您的支持,是我不斷創作的最大動力~
歡迎點贊,關注,留言交流~
深度學習,樂此不疲~