判斷一個整數是否是回文數≤蹋回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數寂恬。
示例:
輸入: 121
輸出: true
輸入: -121
輸出: false
輸入: 10
輸出: false
方法一:最耿直的方法,沒有之一
轉化成字符串處理结啼,實現原理掠剑,將輸入轉換成字符串,翻轉后和輸入比較郊愧。要注意的是數字邊界問題朴译,即數字最大不能超過2^31,并非此題重點属铁,故不考慮
翠花上代碼
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if(x < 0 || (x % 10 == 0 && x != 0)) return false
let temp = Number(String(x).split('').reverse().join(''))
if(temp === x) {
return true
} else {
return false
}
};
方法二:最文藝的方法眠寿,純數學方法
通過取模的方式將數字反轉,例如
12
焦蘑,取模12%10 = 2
盯拱,即可以得到數字的最后一問;判斷回文數我們只需要反轉一半,如何反轉后半部分的數字狡逢?對于數字1221
宁舰,如果執(zhí)行1221 % 10
,我們將得到最后一位數字1
奢浑,要得到倒數第二位數字蛮艰,我們可以先通過除以10
把最后一位數字從1221
中移除,1221 / 10 = 122
雀彼,再求出上一步結果除以10
的余數壤蚜,122 % 10 = 2
,就可以得到倒數第二位數字徊哑。如果我們把最后一位數字乘以10
袜刷,再加上倒數第二位數字,1 * 10 + 2 = 12
莺丑,就得到了我們想要的反轉后的數字著蟹。如果繼續(xù)這個過程,我們將得到更多位數的反轉數字窒盐。
(小聲BB:最好成績是276ms草则,擊敗96%對手)
翠花上代碼
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
// 特殊情況:
// 如上所述,當 x < 0 時蟹漓,x 不是回文數炕横。
// 同樣地,如果數字的最后一位是 0葡粒,為了使該數字為回文份殿,
// 則其第一位數字也應該是 0
// 只有 0 滿足這一屬性
if(x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
let revertedNumber = 0;
while(x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x = Math.floor(x/10);
}
// 當數字長度為奇數時,我們可以通過 revertedNumber/10 去除處于中位的數字嗽交。
// 例如卿嘲,當輸入為 12321 時,在 while 循環(huán)的末尾我們可以得到 x = 12夫壁,revertedNumber = 123拾枣,
// 由于處于中位的數字不影響回文(它總是與自己相等),所以我們可以簡單地將其去除盒让。
return x === revertedNumber || x === Math.floor(revertedNumber/10);
}