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

罗马数字转整数代码异常:输入超过2位时运行出错

问题分析与修复

核心错误点

你的代码出现3位输入错误的原因是循环逻辑完全错误:

  • 在for j in range(1, len(s))循环里,每次都把i重置为0,导致每次循环都在处理第一个字符和当前j对应的字符,而非依次处理相邻的字符对。比如输入LVI时,循环会执行两次:
    1. j=1:比较L(索引0)和V(索引1),添加50到列表
    2. j=2:再次把i设为0,比较L(索引0)和I(索引2),又添加50到列表
  • 最后再加上最后一个字符I的1,总和就是50+50+1=101,完全偏离正确逻辑。

另外还有两个次要问题:

  1. oper是全局列表,多次调用函数时会累积之前的结果,导致后续计算错误
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:30:57