罗马到整数 python

2 python python-3.x

我正在尝试用 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.我解决这个问题的方法正确吗?

非常感谢。

Har*_*ekh 5

这是一种不同的方法,共 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。这是因为您考虑Cas100Mas1000但应该考虑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