罗马数字转整数代码无法通过测试用例‘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
修复逻辑说明
- 先将第一个字符的数值计入结果,避免处理
i=0时的索引越界问题。 - 从第二个字符开始遍历,对比当前值与前一个值:
- 如果当前值大于前一个值,说明是
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
相关产品推荐
相关产品推荐

