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

JavaScript罗马数字转阿拉伯数字代码异常问题求助

问题分析与修复

你的代码核心错误有两个:

  • 错误比较罗马字符本身而非对应数值:字符串比较是基于Unicode编码,而非罗马数字的实际值。比如字符L的编码(76)小于V的编码(86),导致本该累加的逻辑变成减法,这就是"LVIII"算出-42的直接原因。
  • 循环初始索引处理不当:i=0时,romanArr[i-1]对应romanArr[-1],会得到undefined,虽第一次循环未崩溃,但属于潜在越界问题。

另外,循环变量i未用let声明,会污染全局作用域,这也是需要修正的细节。

修正后的代码

/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
    let romanInts = {
        I: 1,
        V: 5,
        X: 10,
        L: 50,
        C: 100,
        D: 500,
        M: 1000
    }

    let romanArr = s.split("").reverse();
    let res = romanInts[romanArr[0]]; // 先初始化第一个反转元素的值

    // 从索引1开始遍历,避免访问越界的undefined
    for(let i = 1; i < romanArr.length; i++) {
        const currentVal = romanInts[romanArr[i]];
        const prevVal = romanInts[romanArr[i-1]];
        
        if(currentVal < prevVal) {
            res -= currentVal;
        } else {
            res += currentVal;
        }
    }

    return res;
};

修复说明

  1. 数值比较替代字符比较:现在用romanInts映射后的数值进行大小判断,完全符合罗马数字的规则逻辑。
  2. 初始化第一个元素:直接把反转后的第一个元素值赋值给结果,循环从索引1开始,彻底避免了i-1越界的问题。
  3. 声明循环变量:用let声明i,避免全局变量污染。

测试验证:

  • 输入"LVIII":反转后数组为["I","I","I","V","L"],计算过程为1→2→3→8→58,结果正确。
  • 输入"MCMXCIV":反转后数组为["V","I","C","X","M","C","M"],计算结果为5→4→96→106→1106→1006→1996,结果正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:37:30