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

罗马数字转整数:MCMXCIV计算错误,求JavaScript代码排查帮助

罗马数字转整数函数问题排查与修复

问题根源

  • 逻辑或判断完全错误:
    代码里arrayChar[i]===("I"||"X"||"C")这行是致命bug。因为"I"||"X"||"C"的运算结果是第一个真值"I",所以这个条件实际等同于arrayChar[i]==="I"——也就是说,只有I能进入前面的特殊规则判断,X和C永远走else分支直接加基础值。这就是MCMXCIV算出2214的原因:M后的C没触发“C在M前加900”的逻辑,而是直接加了100;后面的X也没触发“X在C前加90”,直接加了10,最后总和自然错了。

  • 分支判断冗余(次要优化点):

    • 第一个if块里的三个if是独立执行的,比如匹配I后还会去检查X和C的条件,完全没必要,改成else if更高效。
    • else块里的所有字符判断也都是独立if,同样建议改成else if,减少无意义的判断。

修复后的代码

/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
    // I=1,V=5,X=10,L=50,C=100,D=500,M=1000    
    const arrayChar = s.split("");
    let count = 0;
    for(let i = 0; i < arrayChar.length; i++){
       // 修正条件:分别检查当前字符是否为I/X/C,且不是最后一个字符
       if(i < arrayChar.length - 1 && (arrayChar[i] === "I" || arrayChar[i] === "X" || arrayChar[i] === "C")){
            if(arrayChar[i] === "I"){
                if(arrayChar[i+1] === "V"){
                    count += 4;
                    i++;
                } else if(arrayChar[i+1] === "X"){
                    count += 9;
                    i++;
                } else {
                    count += 1;
                }
            } else if(arrayChar[i] === "X"){
                if(arrayChar[i+1] === "L"){
                    count += 40;
                    i++;
                } else if(arrayChar[i+1] === "C"){
                    count += 90;
                    i++;
                } else {
                    count += 10;
                }
            } else if(arrayChar[i] === "C"){
                if(arrayChar[i+1] === "D"){
                    count += 400;
                    i++;
                } else if(arrayChar[i+1] === "M"){
                    count += 900;
                    i++;
                } else {
                    count += 100;
                }
            }
        } else {
            if(arrayChar[i] === "I"){
                count += 1;
            } else if(arrayChar[i] === "V"){
                count += 5;
            } else if(arrayChar[i] === "X"){
                count += 10;
            } else if(arrayChar[i] === "L"){
                count += 50;
            } else if(arrayChar[i] === "C"){
                count += 100;
            } else if(arrayChar[i] === "D"){
                count += 500;
            } else if(arrayChar[i] === "M"){
                count += 1000;
            }
        }
    }
    return count;
};

验证结果

修复后测试MCMXCIV:

  • M → 累加1000
  • C后接M → 累加900,跳过下一个M
  • X后接C → 累加90,跳过下一个C
  • I后接V → 累加4,跳过下一个V
    最终总和1000+900+90+4=1994,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:45:43