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

Roman to Integer的Python实现出错,请求排查代码问题

Roman转整数代码的问题分析

你的代码如下:

class Solution:
    def romanToInt(self, s: str) -> int:
        num = 0
        for i in range(len(s)):
            if s[i] == "I":
                try:
                    if s[i+1] == "V" or s[i+1] == "X":
                        num -= 1
                        continue
                except:
                    num += 1
                    continue
                else:
                    num += 1
                    continue
            elif s[i] == "X":
                try:
                    if s[i+1] == "L" or s[i+1] == "C":
                        num -= 10
                        continue
                except:
                    num += 10
                    continue
                else:
                    num += 10
                    continue
            elif s[i] == "C":
                try:
                    if s[i+1] == "D" or s[i+1] == "M":
                        num -= 100
                    continue
                except:
                    num += 100
                    continue
                else:
                    num += 100
                    continue
            elif s[i] == "V":
                num += 5
                continue
            elif s[i] == "L":
                num += 50
                continue
            elif s[i] == "D":
                num += 500
                continue
            else:
                num += 1000
                continue
        return num

问题原因

代码处理字符C时存在逻辑错误,导致非特殊组合的C没有被正确计入总和:

  • 对比I和X的处理逻辑:只有当当前字符属于特殊组合(比如I后跟V/X)时,才会执行continue跳过后续逻辑;如果不属于特殊组合,会走到else块执行num += 对应数值。
  • 但C的处理代码中,try块最后额外加了一个continue——这意味着不管C是否属于特殊组合(后跟D/M),都会直接执行continue,跳过else块的num +=100操作。

以测试用例"MCMXCIV"为例:
其中的XC部分,X被正确处理为-10,但后面的C因为不属于特殊组合(后跟I),try块执行后直接continue,没有执行else块的num +=100,导致这个C的100没有被加到总和里,最终结果比正确值少了100。

修正后的代码

把C处理逻辑中try块里的continue移到if条件内部,和I、X的逻辑保持一致:

class Solution:
    def romanToInt(self, s: str) -> int:
        num = 0
        for i in range(len(s)):
            if s[i] == "I":
                try:
                    if s[i+1] == "V" or s[i+1] == "X":
                        num -= 1
                        continue
                except:
                    num += 1
                    continue
                else:
                    num += 1
                    continue
            elif s[i] == "X":
                try:
                    if s[i+1] == "L" or s[i+1] == "C":
                        num -= 10
                        continue
                except:
                    num += 10
                    continue
                else:
                    num += 10
                    continue
            elif s[i] == "C":
                try:
                    if s[i+1] == "D" or s[i+1] == "M":
                        num -= 100
                        continue  # 将continue移到if条件内部
                except:
                    num += 100
                    continue
                else:
                    num += 100
                    continue
            elif s[i] == "V":
                num += 5
                continue
            elif s[i] == "L":
                num += 50
                continue
            elif s[i] == "D":
                num += 500
                continue
            else:
                num += 1000
                continue
        return num

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:55:15