检查将罗马数字转换为整数的特定情况



我必须创建一个带有1个参数的函数,该函数接受字符串并将其转换为假定的整数。例如:输入-'IV',输出- 4。如果有人能帮忙,我将不胜感激。另外,我将把代码放在这里以供参考。

def FromRoman(string):
count = 0
for i in string:
if i == 'I':
count += 1
elif i == "V":
count += 5
elif i == 'X':
count += 10
elif i == "L":
count += 50
elif i == 'C':
count += 100
elif i == 'D':
count += 500
elif i == 'M':
count += 1000
return count

假设您正在进行的罗马数字不仅仅是单个字母检查(例如LXIX),我将这样做。

我们将遍历罗马数字,对于每个"数字":

  • 如果该数字的值小于我们的数字中的下一位的值("IV", I的值小于V的值),我们将从我们的答案中减去较低的数字的值
  • 否则,我们只是将数字的值相加。

下面是我在代码中说的:

def romanToInt(roman):
valueMap = {'M': 1000,'D': 500 ,'C': 100,'L': 50,'X': 10,'V': 5,'I': 1}
ans = 0
for i in range(len(roman) - 1):
if valueMap[roman[i]] < valueMap[roman[i+1]]:
ans -= valueMap[roman[i]]
else:
ans += valueMap[roman[i]]
return ans + valueMap[roman[-1]]

这是一个没有rangelen的方法,似乎有效:

value_map = {'M': 1000, 'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1}

def from_roman(string: str):
ans = 0
prev_val = float('inf')
for c in string:
val = value_map[c]
ans += val - 2 * prev_val if val > prev_val else val
prev_val = val
return ans

解释:

在每次迭代中,检查当前的数字是否大于之前的数字。例如,给定IX,那么当我们在X时,我们在运行总数上加10,但我们也减去2倍的前一个值(在这种情况下是2倍的I)。

测试:

assert from_roman('II') == 2
assert from_roman('IV') == 4
assert from_roman('V') == 5
assert from_roman('XVIII') == 18
assert from_roman('XIX') == 19
assert from_roman('XXVIII') == 28
assert from_roman('XXIX') == 29
assert from_roman('XC') == 90
assert from_roman('CD') == 400
assert from_roman('CM') == 900
assert from_roman('MMXXI') == 2021

相关内容

  • 没有找到相关文章

最新更新