LeetCode第8题String to Integer (atoi) JS实现测试失败求助
排查并修正myAtoi函数的问题
原函数代码
var myAtoi = function(s) { if(s.length > 200) return const reg = s.replace(/-\D/g, ''); let num = parseInt(reg) if(s.includes("-+")) return 0 if((isNaN(num))) return 0 if(s>2147483648) return 2147483647 if(s<-2147483648) return -2147483648 return num };
测试用例失败情况
- 输入 = "2147483648"
- 输出 = 2147483648
- 预期结果 = 2147483647
问题分析
- 边界判断逻辑错误:原代码拿字符串
s与数字比较,且判断条件不符合题目要求。正确边界应为:转换后的数字大于2^31-1(2147483647)时返回上限,小于-2^31(-2147483648)时返回下限。原代码中s>2147483648的条件,对输入"2147483648"来说,字符串与数字比较结果为相等,无法触发返回上限的逻辑。 - 正则处理逻辑错误:
/-\D/g仅能替换-后跟非数字的组合,无法正确提取有效数字部分,比如无法处理前导空格、合法正负号前缀等场景。 - 长度判断返回值缺失:
if(s.length > 200) return会返回undefined,不符合题目要求的返回规则。 - 正负号处理不严谨:仅判断
s.includes("-+")无法覆盖所有非法符号组合(如"+-"),且符号判断应基于有效数字的起始部分,而非整个字符串。
修正后的代码
var myAtoi = function(s) { const MAX = 2147483647; const MIN = -2147483648; // 去除前导空格 let str = s.trim(); // 长度超过200直接返回0 if (str.length > 200) return 0; // 处理符号 let sign = 1; let index = 0; if (str[index] === '+' || str[index] === '-') { sign = str[index] === '-' ? -1 : 1; index++; } // 提取连续数字 let numStr = ''; while (index < str.length && /\d/.test(str[index])) { numStr += str[index]; index++; } // 无有效数字返回0 if (!numStr) return 0; // 转换为数字并应用符号 let num = sign * parseInt(numStr, 10); // 处理边界 if (num > MAX) return MAX; if (num < MIN) return MIN; return num; };
修正说明
- 先去除字符串前导空格,符合题目忽略前导空白的要求。
- 明确处理正负号,仅允许数字前出现一次
+或-符号。 - 提取连续的数字字符,确保只转换有效数字部分。
- 基于转换后的数字进行边界判断,超过上限返回2147483647,低于下限返回-2147483648。
- 修复长度判断后的返回值,确保返回0而非
undefined。
内容的提问来源于stack exchange,提问作者riad bensebti
相关产品推荐
相关产品推荐

