You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题分析

  1. 边界判断逻辑错误:原代码拿字符串s与数字比较,且判断条件不符合题目要求。正确边界应为:转换后的数字大于2^31-1(2147483647)时返回上限,小于-2^31(-2147483648)时返回下限。原代码中s>2147483648的条件,对输入"2147483648"来说,字符串与数字比较结果为相等,无法触发返回上限的逻辑。
  2. 正则处理逻辑错误:/-\D/g仅能替换-后跟非数字的组合,无法正确提取有效数字部分,比如无法处理前导空格、合法正负号前缀等场景。
  3. 长度判断返回值缺失:if(s.length > 200) return会返回undefined,不符合题目要求的返回规则。
  4. 正负号处理不严谨:仅判断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;
};

修正说明

  1. 先去除字符串前导空格,符合题目忽略前导空白的要求。
  2. 明确处理正负号,仅允许数字前出现一次+或-符号。
  3. 提取连续的数字字符,确保只转换有效数字部分。
  4. 基于转换后的数字进行边界判断,超过上限返回2147483647,低于下限返回-2147483648。
  5. 修复长度判断后的返回值,确保返回0而非undefined。

内容的提问来源于stack exchange,提问作者riad bensebti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:55:54