题目翻译:
罗马数字由七个不同的符号表示:I,V,X,L,C,D和M.
符号值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如,两个用罗马数字写成II,只有两个加在一起。十二写为XII,简称为X + II。第二十七号写成XXVII,即XX + V + II。
罗马数字通常从左到右从最大到最小。但是,四个数字不是IIII。相反,第四个写为IV。因为一个在五个之前,我们减去四个。同样的原则适用于九号,即九号。有六个使用减法的实例:
I可以放在V(5)和X(10)之前做4和9。
X可以放在L(50)和C(100)之前,以产生40和90。
C可以放在D(500)和M(1000)之前,以产生400和900。
给定一个整数,将其转换为罗马数字。输入保证在1到3999的范围内。
题目分析:
这个题目是将罗马数字转换成数字输出,与12题故相似也有两种方法。
代码说明:
1、倒序版中用last保存上一个数不要要预读。
2、如果下一个数小于上一个数,那么减两次较小的,然后再加一次小的,这个实现比较巧妙简洁。
for i in range(len(num_list)):
while num >= num_list[i]:
测试代码:
使用字典一一对应,只需注意高位字符一定大于低位字符即可,如果高位小于低位则减掉两个低位字符(后面会再加上一个)。代码中倒序了字符串更好判断,也可不倒序。
倒序版:
class Solution:
# @return an integer
def romanToInt(self, s):
numerals = { "M": 1000, "D": 500, "C": 100, "L": 50, "X": 10, "V": 5, "I": 1 }
sum=0
s=s[::-1]
last=None
for x in s:
if last and numerals[x]<last:
sum-=2*numerals[x]
sum+=numerals[x]
last=numerals[x]
return sum
print(Solution().romanToInt('MCMXCIV')) #提交时请删除该行
不倒序版(每次要多预读一个字符):
class Solution:
# @return an integer
def romanToInt(self, s):
num = 0
roman_num = {'M': 1000, 'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1}
for i in range(len(s)):
if i < len(s) - 1 and roman_num[s[i]] < roman_num[s[i+1]]:
num -= 2*roman_num[s[i]]
num += roman_num[s[i]]
return num
print(Solution().romanToInt('LVIII')) #提交时请删除该行
也可使用判断再对应的方法:
class Solution:
def romanToInt(self, s):
num = 0
i = 0
while(i < len(s)):
if i < len(s) - 1 and s[i] == 'C' and s[i+1] == 'D':
num += 400
i += 2
elif i < len(s) - 1 and s[i] == 'C' and s[i+1] == 'M':
num += 900
i +=2
elif i < len(s) - 1 and s[i] == 'X' and s[i+1] == 'L':
num += 40
i += 2
elif i < len(s) - 1 and s[i] == 'X' and s[i+1] == 'C':
num += 90
i += 2
elif i < len(s) - 1 and s[i] == 'I' and s[i+1] == 'V':
num += 4
i += 2
elif i < len(s) - 1 and s[i] == 'I' and s[i+1] == 'X':
num += 9
i += 2
elif s[i] == 'M':
num += 1000
i +=1
elif s[i] == 'D':
num += 500
i +=1
elif s[i] == 'C':
num += 100
i +=1
elif s[i] == 'L':
num += 50
i +=1
elif s[i] == 'X':
num += 10
i +=1
elif s[i] == 'V':
num += 5
i +=1
elif s[i] == 'I':
num += 1
i +=1
return num
print(Solution().romanToInt('MCMXCIV')) #提交时请删除该行