前言
- 解这题的第一思路就是直接反转整个数字,然后与未反转前的数比较,相等说明是回文数,反之则不是回文数。
- 然后自己优化了下边界判断,当传入的数是负数或者是10的倍数则一定不是回文数。
- 看了leetcode题解后,其实只需要反转后一半的数字,与剩下的数字比较即可。
一、题目描述
-
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
-
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
二、代码
2.1 反转整个数字
/**
* @param {number} x
* @return {boolean}
*/
const isPalindrome = function(x) {
// 负数以及10的倍数一定不是回文数
if(x < 0 || x % 10 === 0 && x !== 0) return false
// 反转前
const reverseBefore = x.toString()
// 反转后
let reverseAfter = ''
// 倒序遍历
for(let i = reverseBefore.length - 1; i >= 0; i--) {
reverseAfter += reverseBefore[i]
}
// 返回比较结果
return reverseBefore === reverseAfter
}
2.2 反转后一半数字
这里其实有个注意的地方,数字长度是奇数该怎么处理
/**
* @param {number} x
* @return {boolean}
*/
const isPalindrome = function(x) {
// 负数 10的倍数一定不是回文数
if(x < 0 || x % 10 === 0 && x !== 0) return false
// 前一半,后一半反转对比
let halfBefore = x
let halfAfter = 0
while(halfBefore > halfAfter) {
halfAfter = halfAfter * 10 + halfBefore % 10
halfBefore = Math.floor(halfBefore / 10)
}
// 数字长度为奇数时,去掉中间的那个数再比较
return halfBefore === halfAfter || halfBefore === Math.floor(halfAfter / 10)
}