# 回文数
# 题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
力扣🔗:https://leetcode-cn.com/problems/palindrome-number (opens new window)
# 解题思路
# 解法一
- 将传入整数转为字符串,依次遍历每个数字字符,判断与其对称的数字字符是否相等。
# 解法二
- 首先获取该整数的数量级
n
,公式是10 ** ~~Math.log10(x)
(~~
是两个按位非,用于取出整数部分,相当于Math.floor()
),例如121 -> 100
。 - 通过
~~(x / n)
和x % 10
分别取到x
的首末数字,例如121 -> 1,1
。 - 然后通过
~~((x % n) / 10)
拿到去除x
首末位的值,并更新x
, 例如121 -> 1
。 - 因此,我们只需要不断对比取出的首末位是否相等和更新
x
就可以判断该整数是否是回文。
# 代码实现
/**
* @param {number} x
* @return {boolean}
*/
function isPalindrome(x) {
x = x.toString()
const l = x.length
for (let i = 0; i < parseInt(l / 2); i++) {
if (x[i] !== x[l - i - 1]) {
return false
}
}
return true
}
/* 解法二 */
function isPalindrome(x) {
if (x < 0) return false
if (x < 10) return true
let n = 10 ** ~~Math.log10(x) // 拿到该整数的数量级
while (n > 1) {
// ~~(x / n) 取到当前 x 的第一位,x % 10 取到当前 x 末位
if (~~(x / n) !== x % 10) {
return false
}
x = ~~((x % n) / 10) // 去除 x 两端的数字,并更新 x
n /= 100 // 因每次只对比 x 首末两个数字,也就是两个数量级,因此更新 n 数为 n / 100
}
return true
}