# [9] 回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
这道题最容易想到的方法就是将数字转换成字符串,直接用首尾指针匹配一一匹配即可。
function isPalindrome(x: number): boolean {
if (x < 0) return false;
const str = x.toString();
const len = str.length;
const mid = Math.floor(str.length / 2);
if (len % 2 === 0) {
return palindrome(mid - 1, mid);
}
return palindrome(mid, mid);
function palindrome(l: number, r: number) {
while (l >= 0 && r < len && str[l] === str[r]) {
l -= 1;
r += 1;
}
if (l >= 0 || r < len) {
return false;
}
return true;
}
}
但是题目要求不能进行类型转换,那么就得用数学的方式来解决这个问题。
首先找到一个能除 x 结果为个位的除数,从而获得首位的值,再对 x 对 10 取余从而得到末位的值。两相比对,不同则直接返回 false。若相同,将 x 的值对除数取余再除以 10,除数除以 100,目的是为了让 x 去除首末两位数,从而进入下一次迭代。直到 x <= 0 时,说明此时已经没有首末位可供判断,迭代结束,返回 true。
function isPalindrome(x) {
if (x < 0) return false;
// 判断能相除能取x首位的除数
let divisor = 1;
while (x / divisor >= 10) divisor *= 10;
while (x > 0) {
const l = Math.floor(x / divisor);
const r = x % 10;
if (l !== r) return false;
x = ((x % divisor) - r) / 10;
divisor /= 100;
}
return true;
}
← [7] 整数反转 [13] 罗马数字转整数 →