
本文详解如何在 javascript 中高效判断一个整数是否为回文数,涵盖基础字符串解法、时间复杂度分析,并重点介绍避免字符串转换的双指针数学解法,兼顾可读性与性能(o(log n) 时间、o(1) 空间)。
本文详解如何在 javascript 中高效判断一个整数是否为回文数,涵盖基础字符串解法、时间复杂度分析,并重点介绍避免字符串转换的双指针数学解法,兼顾可读性与性能(o(log n) 时间、o(1) 空间)。
判断回文数看似简单,但细节决定性能与健壮性。最直观的方法是将数字转为字符串,再比较其与反转后的字符串是否相等:
const isPalindrome = (x) => {
if (x < 0) return false;
const str = x.toString();
return str === str.split('').reverse().join('');
};该解法简洁易懂,但存在明显瓶颈:split()、reverse() 和 join() 均需遍历整个字符串,时间复杂度为 O(n)(n 为数字位数),且额外分配了 O(n) 的字符串空间。更关键的是,它未利用数字本身的数学特性,也忽略了负数、末尾含零(如 10)等边界情况的提前终止逻辑。
真正的优化方向是避免字符串转换,直接通过数学运算提取数字的首尾位进行对称比较。核心思路如下:
- 负数直接返回 false(符号破坏对称性);
- 末尾为 0 的正数(除 0 外)必然非回文(因首位不能为 0);
- 使用「反转后半段数字」策略:不断取余(x % 10)获取末位,累加构建反转数;同时用 Math.floor(x / 10) 缩短原数;
- 当反转数 ≥ 原数时,说明已处理过半——此时若位数为奇数,忽略反转数的最后一位(即中间位),再比较两部分是否相等。
该方法仅需一次遍历(位数的一半),时间复杂度为 O(log₁₀ n)(log 以 10 为底,即位数),空间复杂度为 O(1),且无字符串开销:
立即学习“Java免费学习笔记(深入)”;
function isPalindrome(x) {
if (x < 0 || (x % 10 === 0 && x !== 0)) return false;
if (x === 0) return true;
let reversed = 0;
while (x > reversed) {
reversed = reversed * 10 + x % 10;
x = Math.floor(x / 10);
}
// 偶数位:x === reversed;奇数位:x === Math.floor(reversed / 10)
return x === reversed || x === Math.floor(reversed / 10);
}✅ 关键优化点说明:
- x % 10 === 0 && x !== 0 提前拦截 10, 100, -121 等无效输入;
- 循环条件 x > reversed 精确控制处理边界,自动适配奇偶位数;
- 最终判断覆盖两种情形:1221 → x=12, reversed=12;12321 → x=12, reversed=123,故需 Math.floor(reversed / 10) 消除中间位。
⚠️ 注意事项:
- 避免使用 parseInt() 处理大数(可能丢失精度),Math.floor(x / 10) 更安全;
- 不推荐原答案中基于字符串索引 num[i] 的写法——number 类型无索引访问能力,该代码实际会报错;
- 此数学解法天然规避了字符串内存分配,更适合高频调用或资源受限场景。
综上,从可维护性出发可选用字符串解法;追求极致性能与空间效率时,数学双指针法是更优实践。


















