我正在尝试用 python3 解决这个 python 问题,我的代码如下所示。
class Solution:
def romanToInt(self, s: str) -> int:
# Define integer value to each roman
rom_val = {'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000}
# A list of integer values
value = list(map(rom_val.get, s))
# The subtracted new number
new = 0
# The converted integer number
integer = 0
# List to keep the checked roman
checked = []
for i, j in enumerate(value):
if j > value[i+1] or j == value[i+1]:
checked.append(j)
if j < value[i+1]:
new = value[i+1] - j
checked.append(new)
return sum(checked)
Run Code Online (Sandbox Code Playgroud)
但是,我在第一个 if 语句中收到 IndexError: list index out of range 。尽管我知道这是一个相当简单的问题,但有一些我不明白的地方。所以我有两个问题:1.当然,为什么我会收到这个索引错误?我如何解决它?2.我解决这个问题的方法正确吗?
非常感谢。
这是一种不同的方法,共 5 行:
d = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1}
def romanToInt(self, s):
res, p = 0, 'I'
for c in s[::-1]:
res, p = res - d[c] if d[c] < d[p] else res + d[c], c
return res
Run Code Online (Sandbox Code Playgroud)
基本上,向后,将每个字母添加到结果中,除非较小的字母在较大的字母前面,在这种情况下是减法而不是加法。
注意:以下不是完整的解决方案,只是修复问题中提到的错误。您的算法存在重大错误。
MCMXCIV应该是这样1994,但它会返回3099。这是因为您考虑Cas100和Mas1000但应该考虑CMas 900。既然上面有一个解决方案,我就把这个作为练习留给你。
您的代码的问题在于,即使您到达最后一个索引,您也会检查i + 1. 你可以这样解决这个问题:
def romanToInt(s: str) -> int:
# Define integer value to each roman
rom_val = {'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000}
# A list of integer values
value = list(map(rom_val.get, s))
# List to keep the checked roman
checked = []
for i, j in enumerate(value):
if i == len(value) - 1:
checked.append(j)
elif j >= value[i+1]:
checked.append(j)
elif j < value[i+1]:
checked.append(value[i+1] - j)
print(checked)
return sum(checked)
print(romanToInt("LVIII"))
Run Code Online (Sandbox Code Playgroud)
我还使您的代码更加简洁,删除了不必要的变量。主要的变化只是检查它是否是 in 上的最后一个索引value。