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

我的romanToInt罗马数字转整数代码输出错误,该如何排查?

问题原因

  • 越界访问问题:遍历过程中直接读取s[i+1],当i走到字符串最后一个下标 s.size()-1时,i+1超出了字符串的合法访问范围,属于未定义行为。C++字符串末尾默认是\0,你使用的unordered_map用[]访问不存在的键时,会自动插入值为0的对应条目,所以最后一次判断会把越界读到的内容对应的值当做0处理。
  • 累加逻辑重复:以你测试的输入IV为例:

i=0时,判断I对应值1 < V对应值5,累加5-1=4,此时result为4
i=1时,判断V对应值5 >= 越界读到的\0对应值0,累加5,最终result为9,和你得到的错误输出完全吻合

修复方案

调整逻辑为:如果当前字符值小于下一个字符值,就减去当前值,否则加上当前值,最后单独累加最后一个字符的值即可,修改后代码如下:

int romanToInt(string s) {
    unordered_map<char, int> map ={{'M',1000},{'D',500},{'C',100},{'L',50},{'X',10},{'V',5},{'I',1}};
    int result = 0;
    // 循环只走到倒数第二个字符,避免越界
    for(int i=0;i<s.size()-1;i++)
    {
        if(map[s[i]]>=map[s[i+1]])
            result += map[s[i]];
        else
            result -= map[s[i]];
    }
    // 最后加上最后一个字符的值
    result += map[s.back()];
    return result;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:18:00