JavaScript回文数判断代码对10的倍数返回结果错误排查
问题根因
你的代码存在4个核心问题,直接导致10的倍数场景判断失效,同时存在隐性逻辑bug:
- 字符串转换方法调用错误:直接写
toString(x)是调用全局顶层toString方法,不会按预期将传入的数字转为对应数字字符串,正确转换应该用实例方法x.toString()或者强制转换方法String(x)。 - 数组reverse方法的引用逻辑错误:
Array.reverse()是原地修改方法,执行后会直接改动原数组的元素顺序,返回值就是原数组本身的引用。你将reverse的返回值赋值给reversedString后,reversedString和splitString实际指向内存中同一个数组,两者的相等判断完全起不到「原内容和反转内容对比」的作用。 - 引用类型对比逻辑错误:JS里数组是引用类型,哪怕两个独立数组的元素完全一致,直接用
==对比时,判断的是两个变量是否指向同一块内存地址,不会对比实际内容,永远无法得到正确的内容对比结果。 - 边界场景遗漏:所有大于0且是10的倍数的数字,末尾必然是0,而回文数作为合法数字不可能有前导0,因此除0本身外所有10的正整数倍都不可能是回文数,你的代码没有覆盖这个边界判断,叠加前面的引用bug,就会把10、100这类数字误判为回文数。
另外你把负数判断的逻辑放在了字符串转换、反转操作之后,属于逻辑顺序不合理,会多执行无意义的代码。
修正方案
先做边界场景拦截提前返回,再修正字符串转换、数组反转、内容对比的逻辑,修正后可通过所有测试用例,代码如下:
var isPalindrome = function(x) { // 提前拦截边界场景:负数、大于0的10的倍数直接返回false if (x < 0 || (x > 0 && x % 10 === 0)) { return false; } // 正确将数字转为字符串 const numStr = String(x); // 拆分为字符数组 const strArr = numStr.split(""); // 拷贝一份新数组后再反转,避免和原数组共用引用 const reversedArr = [...strArr].reverse(); // 两个数组都转回字符串后,对比内容是否一致 return strArr.join("") === reversedArr.join(""); };
测试用例验证
- 传入121:原字符串为"121",反转后为"121",返回
true,符合预期 - 传入-121:命中负数拦截规则,返回
false,符合预期 - 传入10:命中「大于0的10的倍数」拦截规则,返回
false,符合预期 - 传入0:不触发拦截,反转后内容一致,返回
true,符合预期 - 传入55:原字符串为"55",反转后为"55",返回
true,符合预期
内容的提问来源于stack exchange,提问作者DiyaS
相关产品推荐
相关产品推荐

