python - 将罗马数字转换为整数

标签 python algorithm roman-numerals

我接到了将罗马数字转换为整数的任务,并且能够想出以下解决方案:

def roman_numeral_to_int(string):
    symbols = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000
    }
    repetitions = {}
    result = 0
    skip = 0
    for i, c in enumerate(string):
        if i == skip and i != 0:
            continue
        if c not in symbols:
            return None
        if c in repetitions.items():
            repetitions[c] += 1
        else:
            repetitions = {c: 1}
        for r, v in repetitions.items():
            if (r in ['L', 'D', 'V'] and v > 1) or (r in ['I', 'X', 'C'] and v > 3):
                return None
        if c == 'I':
            # last character in the string
            if i == len(string) - 1:
                result += 1
            elif string[i+1] == 'V':
                result += 4
                skip = i + 1
            elif string[i+1] == 'X':
                result += 9
                skip = i + 1
        elif c == 'X':
            # last character in the string
            if i == len(string) - 1:
                result += 10
            elif string[i+1] == 'L':
                result += 40
                skip = i + 1
            elif string[i+1] == 'C':
                result += 90
                skip = i + 1
        elif c == 'C':
            # last character in the string
            if i == len(string) - 1:
                result += 100
            elif string[i+1] == 'D':
                result += 400
                skip = i + 1
            elif string[i+1] == 'M':
                result += 900
                skip = i + 1
        else:
            skip = 0
            result += symbols[c]
    return result

但是,此解决方案得到错误答案,字符串 MLXVI 应输出 1066,而此代码产生 1056。

有人可以指出这个解决方案有什么问题吗?

最佳答案

只是快速阅读,但是......

if i == skip and i != 0如果skip,则第一个字符不需要特例不完全是0 .

if c in repetitions.items()似乎极不可能工作;这些项目是元组和c是一个字符。

repetitions应该是 collections.Counter .

您已经为一堆字符 (IXC) 编写了特殊情况,尽管规则是一致的:在减去较高幅度之前较低幅度。除其他事项外,这些特殊情况具有硬编码值。

那些特殊情况包括忽略字符的隐式情况。

关于python - 将罗马数字转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48801826/

相关文章:

python - 从 Databrick 文件系统读取文件

python - Python InsecureRequestWarning 的真正含义是什么?

c - 删除/替换字符数组中的两个或多个连续字符

algorithm - 证明算法在确定位串中 1 位数方面的正确性

java - 罗马数字的字符串替换

c - 罗马数字转字母

python - 从python中的字符串中提取罗马数字

python - 使用 web2py 检索表字段

python - 像第一次安装一样还原 Anaconda

arrays - 检查数组之间重叠的算法