LeetCode罗马数字转整数Python代码问题:部分测试用例未通过
代码问题排查
致命赋值错误
处理字符'M'时,代码写的是v2==1000——这是比较运算符,不是赋值操作,导致'M'对应的数值始终为0,所有包含M的测试用例都会计算错误。必须改成v2=1000。初始值的逻辑瑕疵
变量vp初始化为0(整数类型),虽然第一次循环不会触发减法逻辑,但从类型一致性角度,更严谨的做法是初始化为None或空字符串,避免类型不匹配带来的意外问题。冗余代码
return v之后的print(v)永远不会执行,属于无效代码,可直接删除。减法逻辑的优化建议
你的减法逻辑(从后往前遍历,当前字符为I/X/C且前一个字符对应大数时减当前值)本身是正确的,但可以合并重复判断,让代码更简洁,比如把v1=='I' and vp=='V'和v1=='I' and vp=='X'合并为v1=='I' and (vp=='V' or vp=='X')。
修正后的代码示例
def romanToInt(s): l = len(s) v = 0 a = -1 vp = None # 改为None保证类型一致 while a >= -l: v1 = s[a] v2 = 0 if v1 == 'I': v2 = 1 elif v1 == 'V': v2 = 5 elif v1 == 'X': v2 = 10 elif v1 == 'L': v2 = 50 elif v1 == 'C': v2 = 100 elif v1 == 'D': v2 = 500 elif v1 == 'M': v2 = 1000 # 修正赋值运算符 else: print("unknown") # 优化减法逻辑判断 if vp is not None: if v1 == 'I' and (vp == 'V' or vp == 'X'): v -= v2 elif v1 == 'X' and (vp == 'L' or vp == 'C'): v -= v2 elif v1 == 'C' and (vp == 'D' or vp == 'M'): v -= v2 else: v += v2 else: # 第一次循环直接累加当前值 v += v2 a -= 1 vp = v1 return v
更简洁的实现方式
用字典映射罗马字符与数值,结合反向遍历,代码可读性更高:
def romanToInt(s): roman_map = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000} total = 0 prev_val = 0 # 反向遍历字符串,简化判断逻辑 for char in reversed(s): current_val = roman_map[char] if current_val < prev_val: total -= current_val else: total += current_val prev_val = current_val return total
内容的提问来源于stack exchange,提问作者prahas nambiar
相关产品推荐
相关产品推荐

