LeetCode提交回文数代码时输入1返回false,本地及编辑器正常
异常根因定位
- 代码中
temp、rev被声明在全局作用域,没有在每次回文判定流程开始时重置初始值 - LeetCode正式判题采用同一V8上下文连续串行执行所有测试用例的模式,不会在单个测试用例运行完成后重置全局变量的内存状态:
- 本地开发环境、LeetCode内置编辑器单运行
x=1测试用例时,程序刚启动全局rev初始值为0,计算得到反转值为1,和原数相等,返回符合预期的true - 判题流程下会先执行靠前的测试用例(比如
121、1001这类需要多轮计算反转值的用例),全局rev会被上一个用例的计算结果污染残留。轮到运行测试用例x=1时,函数拿到的rev不再是初始0,计算得到的反转值是上一个残留值和1拼接后的结果,和原数1根本不相等,因此返回错误的false
- 本地开发环境、LeetCode内置编辑器单运行
- 附带逻辑隐患:原递归逻辑没有逐层接住函数返回值,完全依赖修改变量全局状态完成计算,本身耦合性极强,很容易受执行顺序干扰
代码修正方案
最小改动适配原递归逻辑
将变量初始化移入每次isPalindrome的执行作用域内,替换更稳定的整数除法逻辑,从根源上避免跨用例的变量污染:
var isPalindrome = function (x) { if (x < 0) return false; if (x == 0) return true; // 每次执行判定时在独立作用域初始化变量,无跨用例残留 let temp = 0; let rev = 0; const palindromeCheck = (org) => { temp = org % 10; rev = rev * 10 + temp; org = Math.floor(org / 10); // 替换parseInt做整数除法,避免浮点数精度问题 if (org > 0) { palindromeCheck(org); } } palindromeCheck(x); return rev === x; };
更稳妥的生产级实现
采用反转数字后半段的思路,既避免全局变量污染问题,也规避整数溢出风险,适配LeetCode全量测试用例:
var isPalindrome = function (x) { // 提前排除必然非回文的场景 if (x < 0 || (x % 10 === 0 && x !== 0)) return false; let reversedHalf = 0; // 仅反转数字后半段,减少计算量 while (x > reversedHalf) { reversedHalf = reversedHalf * 10 + x % 10; x = Math.floor(x / 10); } // 偶数长度数字直接比对,奇数长度数字去掉中间位再比对 return x === reversedHalf || x === Math.floor(reversedHalf / 10); };
内容的提问来源于stack exchange,提问作者Dheeraj Kumar
相关产品推荐
相关产品推荐

