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
相关产品推荐
相关产品推荐

