原题链接
9. 回文数
解题思路
- 翻转数字
- 利用循环,每次将x右移一位
- 将移出的数字存储到
reversed
的个位中
- 每次存储前,需要将
reversed
左移一位
- 判断结果
- 当原x的长度为偶数,翻转后的结果相等
- 当原x的长度为奇数,reversed一定比翻转后的x多一位,需要将其向右移动一位后再对比
- 处理特殊情况
- x为负数,不是回文数
- 除了0以外的,最后一位为0的数字,必然不是回文数
示例代码
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
// x为负数,不是回文数
if (x < 0) {
return false
}
// 除了0以外的,最后一位为0的数字,必然不是回文数
// 如果数字最后一位是0,必然是10的倍数,取余后为0
if (x % 10 === 0 && x !== 0) {
return false
}
// 存储反转后的数字
let reversed = 0
// 翻转x,直到x>reversed,表示翻转结束
while (x > reversed) {
// 每次翻转时,将reversed*10,表示向左移动一位
// 再将x的个位数,填充到reversed的个位
reversed = reversed * 10 + (x % 10)
// x/10,表示x向右移动一位,并保留整数
x = Math.floor(x / 10)
}
// 翻转后有两种可能性
// 1. 当原x的长度为偶数,翻转后的结果相等
// 2. 当原x的长度为奇数,reversed一定比翻转后的x多一位,需要将其向右移动一位后再对比
return x === reversed || Math.floor(reversed / 10) === x
};