罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
给定一个罗马数字,将其转换成整数。
"""
法一:采用dict字典模式
class Solution:
def romanToInt(self, s: str) -> int:
dicts = {
'I' : 1,
'V' : 5,
'X' : 10,
'L' : 50,
'C' : 100,
'D' : 500,
'M' : 1000,
'IV': 4,
'IX': 9,
'XL': 40,
'XC': 90,
'CD': 400,
'CM': 900
}
special = ['IV','IX','XL','XC','CD','CM']
result = []
sums = 0
i = 0
while i < len(s):
if s[i:i+2] in special:
result.append(s[i:i+2])
i += 2
else:
result.append(s[i])
i += 1
for j in range(len(result)):
sums += dicts[result[j]]
return sums
s = "IV"
S = Solution()
result = S.romanToInt(s)
print(result)
法二:小的数字在大的数字的左边的情况,根据规则需要减去小的数字
通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,那么可以将每个字符视作一个单独的值,累加每个字符对应的数值即可。
例如 XXVII 可视作 X+X+V+I+I=10+10+5+1+1=27。
若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。对于这种情况,我们也可以将每个字符视作一个单独的值,若一个数字右侧的数字比它大,则将该数字的符号取反。
例如 XIV 可视作 X−I+V=10−1+5=14。
class Solution:
SYMBOL_VALUES = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
}
def romanToInt(self, s: str) -> int:
ans = 0
n = len(s)
for i, ch in enumerate(s):# list(enumerate(s))=[(0,'I'),(1,'V')]
value = self.SYMBOL_VALUES[ch]#或者 Solution.SYMBOL_VALUES[ch]
if i < n - 1 and value < self.SYMBOL_VALUES[s[i + 1]]:
ans -= value
else:
ans += value
return ans
s = "IV"
S = Solution()
result = S.romanToInt(s)
print(result)



