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

LeetCode第13题JS实现疑问:为何仅转换罗马数字首字符?

罗马数字转整数:仅转换第一个字符的问题分析与修复

首先看你目前的代码片段,能发现两个核心问题导致只处理了第一个字符:

  • 你还没写出遍历整个罗马数字字符串的逻辑,目前只初始化了映射表,但没有循环去逐个处理每个字符;
  • 罗马数字的特殊减法规则(比如IV=4、IX=9)也没在代码里体现,不过这是后话,先解决遍历的核心问题。

先把你未完成的代码补全并修正,下面是完整的可运行版本:

var romanToInt = function(s) {
    let result = 0;
    if (!s) return result; // 简化空输入的判断

    const myMap = new Map();
    myMap.set('I', 1);
    myMap.set('V', 5);
    myMap.set('X', 10);
    myMap.set('L', 50);
    myMap.set('C', 100);
    myMap.set('D', 500);
    myMap.set('M', 1000);

    // 遍历每个字符,处理罗马数字的加减规则
    for (let i = 0; i < s.length; i++) {
        const currentVal = myMap.get(s[i]);
        const nextVal = myMap.get(s[i + 1]);

        // 如果当前值小于下一个值,说明是减法情况(比如IV=5-1)
        if (nextVal && currentVal < nextVal) {
            result -= currentVal;
        } else {
            result += currentVal;
        }
    }

    return result;
};

关键修复点说明:

  • 添加了完整的遍历逻辑:通过for循环逐个访问字符串s中的每个字符,确保所有字符都被处理;
  • 处理了罗马数字的减法规则:罗马数字中,如果当前字符的值小于下一个字符的值,就需要用减法(比如IX是10-1=9),否则直接加法;
  • 简化了空输入判断:用!s替代原来的s == null,更简洁地处理空字符串、null等无效输入。

举个实际例子,输入"MCMXCIV",代码会依次处理每个字符:

  • M(1000):加1000 → result=1000
  • C(100) < M(1000):减100 → result=900
  • M(1000):加1000 → result=1900
  • X(10) < C(100):减10 → result=1890
  • C(100):加100 → result=1990
  • I(1) < V(5):减1 → result=1989
  • V(5):加5 → result=1994,最终返回1994,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:50:10