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

罗马数字转整数代码无法通过测试用例‘MCDXC’求助

罗马数字转整数代码问题排查

问题根源

你的代码循环从i=0开始,当i=0时,s[i-1]等价于s[-1](取字符串最后一个字符),这会触发错误的条件判断,直接导致第一个字符的计算错误。以测试用例MCDXC为例:

  • 第一次循环i=0,s[-1]是C,触发C开头的减法分支,计算为1000 - 2*100 = 800,而非正确的直接加1000。后续步骤的错误累加最终得到1290的错误结果。

修复方案

调整循环逻辑:先初始化ans为第一个字符的数值,然后从i=1开始遍历,每次判断当前字符与前一个字符的关系,处理减法场景:

class Solution(object):
    def romanToInt(self, s):
        roman_map = {
            'I': 1,
            'V': 5,
            'X': 10,
            'L': 50,
            'C': 100,
            'D': 500,
            'M': 1000
        }
        ans = roman_map[s[0]]
        for i in range(1, len(s)):
            prev_val = roman_map[s[i-1]]
            curr_val = roman_map[s[i]]
            # 当前值大于前一个值时,说明是减法组合(如IV=4,即5-1)
            if curr_val > prev_val:
                ans += curr_val - 2 * prev_val
            else:
                ans += curr_val
        return ans

修复逻辑说明

  1. 先将第一个字符的数值计入结果,避免处理i=0时的索引越界问题。
  2. 从第二个字符开始遍历,对比当前值与前一个值:
    • 如果当前值大于前一个值,说明是IV/IX/XL等减法组合,由于前一个值已经被加过一次,所以需要减去两倍的前值(抵消之前的加法,再做减法)。
    • 否则直接累加当前值即可。

测试MCDXC:

  • 初始ans=1000(M)
  • i=1(C):100 < 1000,ans +=100 →1100
  • i=2(D):500>100,ans +=500-200=300 →1400
  • i=3(X):10<500,ans +=10 →1410
  • i=4(C):100>10,ans +=100-20=80 →1490,符合预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:52:21