我已经完成了将罗马数字转换为整数的任务,并且能够提出以下解决方案:
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.
有人可以指出这个解决方案有什么问题吗?
答案 0 :(得分:1)
快速阅读,但......
如果if i == skip and i != 0
不正确skip
, 0
就不需要针对第一个被追究的特例。
if c in repetitions.items()
似乎极不可能奏效;这些项目是元组,c
是一个字符。
repetitions
应该是collections.Counter
。
你已经为一堆字符(IXC
)编写了特殊情况,即使规则是一致的:减去较高幅度之前的较低幅度。除其他外,这些特殊情况具有硬编码值。
这些特殊情况包括忽略字符的隐式情况。
答案 1 :(得分:0)
通过在此块中添加else
语句来修复该特定情况:
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
else:
result += 10
但是我发现这可能发生在其他地方,例如多个I
。所以III
应为3,但您的程序返回1.