罗马数字包含以下七种字符:I, V, X, L, C, D和M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如,罗马数字2写做II,即为两个并列的1。12写作XII,即为X + II。27写作XXVII,即为XX+V+II。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如4不写做IIII,而是IV。数字1在数字5左边,所表示的数等于大数5减小数1得到的数值4。同样地,数字9表示为IX。这个特殊的规则只适用于以下六种情况:
- I 可以放在V(5)和X(10)的左边,来表示4和9。
- X可以放在L(50)和C(100)的左边,来表示40和90。
- C可以放在D(500)和M(1000)的左边,来表示400和900。
给定一个罗马数字,将其转换成整数。输入确保在1到3999的范围内。
示例1
输入:“III”
输出:3
示例2
输入:“IV”
输出:4
看完这个题目,首先就是想到先用字典存以下I到M的数值,方便之后索引。然后I,X,C是三种特殊的情况(比如VI是5+1=6,做加法;IV是5-1=4,做减法)。所以,在一个个识别字母的时候只需要考虑和前面一个字母是做加法还是做减法即可。因为题目没有说让判断输入的字符串是不是罗马数字,所以假定输入的都是符合规则的(即不会出现诸如D在M左边这样的情况):
class Solution:
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
r_dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
num = r_dict[s[0]]
sum = 0
if len(s) == 1:
print(num)
else:
for i in s[1:]:
if r_dict[i] <= num:
sum += num
else:
sum -= num
num = r_dict[i]
sum += num
return(sum)
当然,也可以利用最原始的办法来做,就是一个一个的判断情况:
class Solution:
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
i = 0
num = 0
while i<len(s):
if s[i] == 'M':
num += 1000
i += 1
elif s[i] == 'D':
num += 500
i += 1
elif s[i] == 'C':
if (i+1) < len(s) and s[i+1] == 'M':
num += 900
i += 2
elif (i+1) < len(s) and s[i+1] == 'D':
num += 400
i += 2
else:
num += 100
i += 1
elif s[i] == 'L':
num += 50
i += 1
elif s[i] == 'X':
if (i+1) < len(s) and s[i+1] == 'C':
num += 90
i += 2
elif (i+1) < len(s) and s[i+1] == 'L':
num += 40
i += 2
else:
num += 10
i += 1
elif s[i] == 'V':
num += 5
i += 1
elif s[i] == 'I':
if (i+1) < len(s) and s[i+1] == 'X':
num += 9
i += 2
elif (i+1) < len(s) and s[i+1] == 'X':
num += 9
i += 2
elif (i+1) < len(s) and s[i+1] == 'V':
num += 4
i += 2
else:
num += 1
i += 1
return(num)