
本文详解如何在 javascript 中高效判断一个整数是否为回文数,涵盖基础字符串解法、时间复杂度分析,并重点介绍避免字符串转换的双指针数学解法,兼顾可读性与性能(o(log n) 时间、o(1) 空间)。
本文详解如何在 javascript 中高效判断一个整数是否为回文数,涵盖基础字符串解法、时间复杂度分析,并重点介绍避免字符串转换的双指针数学解法,兼顾可读性与性能(o(log n) 时间、o(1) 空间)。
判断回文数看似简单,但细节决定性能与健壮性。最直观的方法是将数字转为字符串,再比较其与反转后的字符串是否相等:
const isPalindrome = (x) => {
if (x <p>该解法简洁易懂,但存在明显瓶颈:split()、reverse() 和 join() 均需遍历整个字符串,<strong>时间复杂度为 O(n)</strong>(n 为数字位数),且额外分配了 O(n) 的字符串空间。更关键的是,它未利用数字本身的数学特性,也忽略了负数、末尾含零(如 10)等边界情况的提前终止逻辑。</p><p>真正的优化方向是<strong>避免字符串转换,直接通过数学运算提取数字的首尾位进行对称比较</strong>。核心思路如下:</p>
- 负数直接返回 false(符号破坏对称性);
- 末尾为 0 的正数(除 0 外)必然非回文(因首位不能为 0);
- 使用「反转后半段数字」策略:不断取余(x % 10)获取末位,累加构建反转数;同时用 Math.floor(x / 10) 缩短原数;
- 当反转数 ≥ 原数时,说明已处理过半——此时若位数为奇数,忽略反转数的最后一位(即中间位),再比较两部分是否相等。
该方法仅需一次遍历(位数的一半),时间复杂度为 O(log₁₀ n)(log 以 10 为底,即位数),空间复杂度为 O(1),且无字符串开销:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
function isPalindrome(x) {
if (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 类型无索引访问能力,该代码实际会报错;
- 此数学解法天然规避了字符串内存分配,更适合高频调用或资源受限场景。
综上,从可维护性出发可选用字符串解法;追求极致性能与空间效率时,数学双指针法是更优实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










