罗马数字包含以下七种字符: I , V , X , L , C , D 和 M I, V, X, L,C,D 和 M I,V,X,L,C,D和M。
例如, 罗马数字 2 2 2 写做 I I II II ,即为两个并列的 1 1 1。 12 12 12 写做 X I I XII XII ,即为 X + I I X + II X+II 。 $27 $写做 X X V I I XXVII XXVII, 即为 X X + V + I I XX + V + II XX+V+II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 4 4 不写做 I I I I IIII IIII,而是 I V IV IV。数字 1 1 1 在数字 5 5 5 的左边,所表示的数等于大数 5 5 5 减小数 1 1 1 得到的数值 4 4 4 。同样地,数字 9 9 9 表示为 I X IX IX。这个特殊的规则只适用于以下六种情况:
I I I 可以放在 V ( 5 ) V (5) V(5) 和 X ( 10 ) X (10) X(10) 的左边,来表示 4 4 4 和 9 9 9。
X X X 可以放在 L ( 50 ) L (50) L(50) 和 C ( 100 ) C (100) C(100) 的左边,来表示 40 40 40 和 90 90 90。
C C C 可以放在 D ( 500 ) D (500) D(500) 和 M ( 1000 ) M (1000) M(1000) 的左边,来表示 400 400 400 和 900 900 900。
给定一个罗马数字,将其转换成整数。
这道题的思路如果想到就很简单,但是想不到就很复杂。从左往右依次遍历,按照对应的罗马数字值依次相加,用 " M C M X C I V " "MCMXCIV" "MCMXCIV"举例, [ M = 1000 + C M = ( − 100 + 1000 ) = 900 ] = 1900 [ M = 1000 + CM = (-100 + 1000)=900 ] = 1900 [M=1000+CM=(−100+1000)=900]=1900 ,因此,我们可以看到当出现左边的数字小于右边的数字时,左边的数字要以负数相加。
class Solution:
def romanToInt(self, s: str) -> int:
dict = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1}
num = 0
# 遍历字典的键值
for i in range(len(s)-1):
# 左边的数比右边大时相加
if dict[s[i]] >= dict[s[i+1]]:
num += dict[s[i]]
# 左边的数比右边小时相减
else:
num -= dict[s[i]]
# 为了防止溢出,i知道倒数第二个字符,因此还需要加上最后一个字符,不需要判断,因为最后一个肯定是正数
num += dict[s[len(s)- 1]]
return num