原題鏈接
解題思路
- 翻轉(zhuǎn)數(shù)字
- 利用循環(huán),每次將x右移一位
- 將移出的數(shù)字存儲到
reversed的個位中 - 每次存儲前,需要將
reversed左移一位
- 判斷結(jié)果
- 當(dāng)原x的長度為偶數(shù),翻轉(zhuǎn)后的結(jié)果相等
- 當(dāng)原x的長度為奇數(shù),reversed一定比翻轉(zhuǎn)后的x多一位,需要將其向右移動一位后再對比
- 處理特殊情況
- x為負(fù)數(shù),不是回文數(shù)
- 除了0以外的,最后一位為0的數(shù)字,必然不是回文數(shù)
示例代碼
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
// x為負(fù)數(shù),不是回文數(shù)
if (x < 0) {
return false
}
// 除了0以外的,最后一位為0的數(shù)字,必然不是回文數(shù)
// 如果數(shù)字最后一位是0,必然是10的倍數(shù),取余后為0
if (x % 10 === 0 && x !== 0) {
return false
}
// 存儲反轉(zhuǎn)后的數(shù)字
let reversed = 0
// 翻轉(zhuǎn)x,直到x>reversed,表示翻轉(zhuǎn)結(jié)束
while (x > reversed) {
// 每次翻轉(zhuǎn)時,將reversed*10,表示向左移動一位
// 再將x的個位數(shù),填充到reversed的個位
reversed = reversed * 10 + (x % 10)
// x/10,表示x向右移動一位,并保留整數(shù)
x = Math.floor(x / 10)
}
// 翻轉(zhuǎn)后有兩種可能性
// 1. 當(dāng)原x的長度為偶數(shù),翻轉(zhuǎn)后的結(jié)果相等
// 2. 當(dāng)原x的長度為奇數(shù),reversed一定比翻轉(zhuǎn)后的x多一位,需要將其向右移動一位后再對比
return x === reversed || Math.floor(reversed / 10) === x
};