LeetCode Roman to Integer:if语句逻辑异常排查
罗马数字转整数if逻辑失效问题排查
代码存在5处核心逻辑错误,直接导致判断不生效、结果异常:
- 笔误导致减法判断永远无法触发:三个特殊减法判断的第二个条件全部写错,将下一位索引
j+1误写为当前索引j,比如I的判断分支里写了romanNum[j]=="I" and romanNum[j]=="X",相当于要求同一个位置的字符同时是I和X,条件永远不成立,X、C对应的判断分支也存在完全相同的笔误。 - 存在索引越界风险:内层循环
j的遍历范围是range(len(romanNum)),当j取到字符串最后一位的索引时,访问romanNum[j+1]会直接触发索引越界报错。 - 规则记忆错误:不存在「X位于V之前时计算结果减2」的规则,罗马数字合法的减法组合仅6种:
IV(4)、IX(9)、XL(40)、XC(90)、CD(400)、CM(900),XV对应数值15,按正常加法计算即可。 - 双重循环逻辑冗余:外层遍历映射表、内层遍历字符串的写法会做大量无效遍历,时间复杂度是O(7n),完全没必要,单次遍历字符串即可完成计算。
- 类方法写法不规范:定义的
roman_numeral方法缺少@staticmethod装饰器,直接通过类调用属于不规范写法。
修正后可运行代码
提供两种实现思路,第一种保留原代码「先全加、遇到特殊组合减差值」的设计,第二种是更简洁的通用判断逻辑:
思路1:保留原代码逻辑修正错误
class Solutions: @staticmethod def roman_numeral(romanNum): value = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000} result = 0 str_len = len(romanNum) # 先遍历所有字符累加总值 for char in romanNum: result += value[char] # 遍历判断特殊减法组合,j最多取到倒数第二位,避免越界 for j in range(str_len - 1): curr = romanNum[j] next_char = romanNum[j+1] if (curr == "I" and next_char in ("V", "X")): result -= 2 if (curr == "X" and next_char in ("L", "C")): result -= 20 if (curr == "C" and next_char in ("D", "M")): result -= 200 return result print(Solutions.roman_numeral("MCMXCIV")) # 输出正确结果1994
思路2:更简洁的通用实现(无需硬编码差值)
class Solutions: @staticmethod def roman_numeral(romanNum): value = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000} result = 0 str_len = len(romanNum) for j in range(str_len): # 不是最后一位,且当前值小于下一位值时减当前值,否则加当前值 if j < str_len - 1 and value[romanNum[j]] < value[romanNum[j+1]]: result -= value[romanNum[j]] else: result += value[romanNum[j]] return result print(Solutions.roman_numeral("MCMXCIV")) # 输出正确结果1994
内容的提问来源于stack exchange,提问作者Azizur Rahaman
相关产品推荐
相关产品推荐

