罗马数字转整数代码异常:输入超过2位时运行出错
问题分析与修复
核心错误点
你的代码出现3位输入错误的原因是循环逻辑完全错误:
- 在
for j in range(1, len(s))循环里,每次都把i重置为0,导致每次循环都在处理第一个字符和当前j对应的字符,而非依次处理相邻的字符对。比如输入LVI时,循环会执行两次:- j=1:比较
L(索引0)和V(索引1),添加50到列表 - j=2:再次把
i设为0,比较L(索引0)和I(索引2),又添加50到列表
- j=1:比较
- 最后再加上最后一个字符
I的1,总和就是50+50+1=101,完全偏离正确逻辑。
另外还有两个次要问题:
oper是全局列表,多次调用函数时会累积之前的结果,导致后续计算错误rtype = int这行代码没有实际作用,属于冗余代码
修复后的代码
romanD = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000} class Solution(object): def romanToInt(self, s): oper = [] # 将列表放在函数内部,避免全局变量累积问题 for i in range(len(s) - 1): current = romanD[s[i]] next_num = romanD[s[i+1]] if current < next_num: oper.append(-current) else: oper.append(current) oper.append(romanD[s[-1]]) # 用s[-1]取最后一个字符更简洁 return sum(oper) s = input('roman: ') b = Solution() print(b.romanToInt(s))
修复说明
- 把
oper移到函数内部,每次调用都会创建新的空列表,避免全局变量的累积问题 - 循环改为遍历
range(len(s)-1),每个i对应当前字符,i+1对应下一个字符,符合罗马数字的比较逻辑(小值在大值左侧时做减法,否则做加法) - 用
s[-1]代替s[len(s)-1],代码更简洁易读 - 移除了无用的
rtype = int代码
测试验证:
- 输入
L→ 返回50 - 输入
LV→ 返回55 - 输入
LVI→ 返回56(正确结果)
内容的提问来源于stack exchange,提问作者schaggy
相关产品推荐
相关产品推荐

