>[success] # 回文數
~~~
判斷一個整數是否是回文數。回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
注意
負數不是回文數
~~~
>[danger] ##### python解題
* 思路
~~~
1.121 發現規律,每一個字符串收尾一致就是回文數
2.利用數字長度的一半循環,則左側項都為i,右側項都為len-1-i
~~~
* 個人解法
~~~
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if x<0:
return False
else:
x = str(x)
if x==0:
return True
for i in range(0,int(len(x)/2)):
if x[i]!=x[len(x)-i-1]:
return False
return True
~~~
* 優秀解法
~~~
1.任何數的余數10,是這個數的末尾數 例如 121%10 =1
2.數字 前半段 和 數字 后半段的數一致 為 回文數 例如 11211 也就是11=11
注:
注釋一:結尾是0的數絕對不是回文數,但是0是回文數
注釋二:例如121 x最后會變成1 而revertedNumber 變成12, 6556 x最后變成56 revertedNumber 變成56,
6565 x最后 變成6 revertedNumber565,如果是奇數個數 或者是偶數非回文函數的數,會多執行一次,來終止循環
如果是偶數的回文函數,就會正好前后一致終止循環
注釋三:面對非回文數,和奇數回文數會比,實際多一個中位數,中位數是最后一位,去掉末尾中位數,去比較實際兩者是否一致
~~~
~~~
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
# 注釋一
if (x<0 or (x%10 == 0 and x!=0)):
return False
else:
revertedNumber = 0
# 注釋二
while x> revertedNumber:
revertedNumber = revertedNumber*10 + x%10
x = x//10
# 注釋三
return x == revertedNumber or x == revertedNumber//10
~~~
* python 解法
~~~
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if x < 0:
return False
else:
return int(str(x)[::-1]) == x
~~~
* js 最快解法

>[danger] ##### js解題
* 最常見的方法,循環當前長度的一半,用首尾值依次比較
~~~
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if(x<0) return false
if(x===0) return true
var x = x.toString()
for(var i =0;i<parseInt(x.length/2);i++){
if(x[i]!=x[x.length-i-1]) return false
}
return true
};
~~~
* 跟第一種思路一樣實現不同
~~~
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if(x<0) return false
var s = x.toString()
var i =0 ,j=s.length-1
while(i<=j){
if(s[i]==s[j]){
i++
j--
}else{
return false
}
}
return true
};
~~~
* 利用反轉整數的思想去比較
~~~
var isPalindrome = function(x) {
if(x<0||x%10===0 &&x!=0){
return false
}
return x.toString().split('').reverse().join("") == x
};
~~~
* 最快解法[關于trunc方法說明]([https://blog.csdn.net/qq\_37016928/article/details/80667247](https://blog.csdn.net/qq_37016928/article/details/80667247))
~~~
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (x < 0) {
return false;
}
let len = 1;
while (x / len > 10) {
len *= 10;
}
while (x > 0) {
let left = Math.trunc(x / len);
let right = x % 10;
if (left !== right) {
return false;
} else {
x = Math.trunc((x % len) / 10);
len /= 100;
}
}
return true;
};
~~~
- 接觸數據結構和算法
- 數據結構與算法 -- 大O復雜度表示法
- 數據結構與算法 -- 時間復雜度分析
- 最好、最壞、平均、均攤時間復雜度
- 基礎數據結構和算法
- 線性表和非線性表
- 結構 -- 數組
- JS -- 數組
- 結構 -- 棧
- JS -- 棧
- JS -- 棧有效圓括號
- JS -- 漢諾塔
- 結構 -- 隊列
- JS -- 隊列
- JS -- 雙端隊列
- JS -- 循環隊列
- 結構 -- 鏈表
- JS -- 鏈表
- JS -- 雙向鏈表
- JS -- 循環鏈表
- JS -- 有序鏈表
- 結構 -- JS 字典
- 結構 -- 散列表
- 結構 -- js 散列表
- 結構 -- js分離鏈表
- 結構 -- js開放尋址法
- 結構 -- 遞歸
- 結構 -- js遞歸經典問題
- 結構 -- 樹
- 結構 -- js 二搜索樹
- 結構 -- 紅黑樹
- 結構 -- 堆
- 結構 -- js 堆
- 結構 -- js 堆排序
- 結構 -- 排序
- js -- 冒泡排序
- js -- 選擇排序
- js -- 插入排序
- js -- 歸并排序
- js -- 快速排序
- js -- 計數排序
- js -- 桶排序
- js -- 基數排序
- 結構 -- 算法
- 搜索算法
- 二分搜索
- 內插搜索
- 隨機算法
- 簡單
- 第一題 兩數之和
- 第七題 反轉整數
- 第九題 回文數
- 第十三題 羅馬數字轉整數
- 常見一些需求
- 把原始 list 轉換成樹形結構