罗马数字包含以下七种字符: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
示例 3:
输入: "IX" 输出: 9
示例 4:
输入: "LVIII" 输出: 58 解释: C = 100, L = 50, XXX = 30, III = 3.
示例 5:
输入: "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.
因为罗马数字转阿拉伯数字的难点就在于特殊情况(IV
, IX
, XL
, XC
,CD
和CM
)的处理,考虑将输入的罗马数字两两分为一组,依次转换为对应的阿拉伯数字。
在主函数部分,遍历罗马数字的每一位,取当前位和下一位组成新的罗马数字传入辅助函数twochar中,得到对应的整数值和判断结果(key),key用于控制罗马数字当前位的下一位的计算(例如XLI,当计算得到XL=40的时候,循环指针在第一位X上,已经不需要比较L这一位了)。最后将每一位(或两位)的值累加就可以得到罗马数字对应的整数值。
辅助函数twochar中。对于输入的两位罗马数字,判断该数字是否为特殊情况,若该数字属于特殊情况,返回该数字对应的整数值及判断结果。若该数字不属于特殊情况,返回第一位对应的整数值及判断结果。
下面是具体的代码实现,有详细的注释:
class Solution(object):
def __init__(self):
self.val={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000} #基本罗马数字字符和阿拉伯数字的转换
def romanToInt(self, s):
temp=s
value=0
key=False #key用于控制当前字符是否跳过处理,默认为false
for i in range(len(temp)): #遍历temp
if key==True: #key为True,表示当前位和上一位组成特殊情况,跳过这一位
key=False #key重置为false
continue #跳过本次循环
elif i==len(temp)-1: #若当前位为最后一位,且不属于特殊情况
value+=self.val[temp[i]] #将当前位对应的整数值累加到value中
else: #最一般的情况
vall,key=self.twochar(temp[i]+temp[i+1]) #将当前位和下一位组合传入twochar中,得到对应的值和
value+=vall #将得到整数值累加到value中
return value
def twochar(self,s):
if(s[0]=='I'): #如果第一位为I
if(s[1]=='V'): #且第二位为V
return 4,True #返回4和True
elif(s[1]=='X'): #以下跟上面三行的情况类似
return 9,True
else:
return 1,False
if(s[0]=='X'):
if(s[1]=='L'):
return 40,True
elif(s[1]=='C'):
return 90,True
else:
return 10,False
if(s[0]=='C'):
if(s[1]=='D'):
return 400,True
elif(s[1]=='M'):
return 900,True
else:
return 100,False
else: #非特殊情况
return self.val[s[0]],False #将第一位对应的整数值传出,key设为Flase
实例化函数以及调用部分
test=Solution()
print test.romanToInt('IV')
>>> 4
test=Solution()
print test.romanToInt('MCMXCIV')
>>> 1994