罗马数字转整数代码问题求助:输入MCMXCIV输出异常
罗马数字转整数函数问题修复
原代码的核心错误
- 判断组合数字的逻辑完全写反:你原本想检查「下一个字符是不是当前字符的后一位/后两位符号」,但代码里写成了判断
s[i]等于这些符号,这直接导致IV、XL这类组合完全不被识别 - 循环中修改
string列表会打乱遍历顺序:迭代过程中移除元素,会跳过后续的索引,导致计算重复或遗漏 - 越界判断错误:
i < len(s)应该是i < len(s)-1,不然最后一个字符访问s[i+1]会直接报错 - 索引查找效率低:反复调用
list(dic.keys()).index()没必要,字典本身就是键值映射,直接用键取 value 就行
修正后的代码
def romanToInt(s): roman_dict = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000} total = 0 n = len(s) for i in range(n): # 如果当前字符不是最后一个,且当前值小于下一个值,用减法 if i < n - 1 and roman_dict[s[i]] < roman_dict[s[i+1]]: total -= roman_dict[s[i]] else: total += roman_dict[s[i]] return total
逻辑说明
罗马数字的核心规则就是:如果当前字符代表的数值小于下一个字符的数值,就做减法;否则做加法。比如:
- IV:1 < 5,所以 total = -1 +5 =4
- MCMXCIV:拆分成 M(1000) + CM(900) + XC(90) + IV(4),计算过程就是1000 -100 +1000 -10 +100 -1 +5 =1994
测试输入MCMXCIV,这个函数会返回正确的1994。
内容的提问来源于stack exchange,提问作者paul
相关产品推荐
相关产品推荐

