(leetcode刷题)
罗马数字转整数
题目: 罗马数字包含以下七种字符: I
, V
,X
, L
,C
,D
和 M
。给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
罗马字符 | 数字 |
---|---|
I |
1 |
V |
5 |
X |
10 |
L |
50 |
C |
100 |
D |
500 |
M |
1000 |
通常情况下,罗马数字中小的数字在大的数字右边。如,罗马数字2写做II
,12写做XII
。但有六种特例:
I
可以放在V
和X
的左边,用来表示4(IV
)和9(IX
)X
可以放在L
和C
的左边,用来表示40(XL
)和90(XC
)C
可以放在D
和M
的左边,用来表示400(CD
)和900(CM
)
示例: 输入:MXMXCIV
,输出:1994
方法
- 我的思路是将所有罗马字母以及特殊字符放在字典中,从后向前遍历
def romanToInt(s):
romNum = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
special = {'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}
i = len(s)
aNum = 0
while i:
lr = ''
if i >1:
lr = s[i - 2]+s[i-1]
if lr in special.keys():
aNum += special[lr]
i -= 2
else:
aNum += romNum[s[i-1]]
i-=1
return aNum
- 另一种思路:遍历的时候若右边比左边大,则减,否则加
def romanToInt(self, s: str) -> int:
romNum={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
lens=len(s)
aNum=0
for i in range(lens-1,-1,-1):
val=romNum[s[i]]
rVal=romNum[s[i+1]] if i !=lens-1 else 0
if val>=rVal:
aNum+=val
else:
aNum-=val
return aNum