题目
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
分析
题目的输入为:一个1-3999范围内的罗马数字字符串
输出为:对应的整数
本题目只需要注意一下罗马数字的命名规则即可,首先罗马数字的基本字符包括:
字符 | I | V | X | L | C | D | M |
---|---|---|---|---|---|---|---|
阿拉伯数字 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
计数规则如下:
- 相同的数字连写,所表示的数等于这些数字相加得到的数,如:III=3;
- 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:VIII=8、XII=12;
- 小的数字(限于 I、X 和 C)在大的数字左边,所表示的数等于大数减小数得到的数,如:IV=4、IX=9;
- 正常使用时,连写的数字重复不得超过三次,特例情况比如:IIIIII和XXXXXX表示VI和LX;
- 在一个数的上面画一条横线,表示这个数扩大 1000 倍,比如 V¯=5000 V ¯ = 5000 ;
- 减法的表示方法仅能用于相邻的数字,比如99应该表示成XCIX,而不是IC。
解答
解题的思路是,从左向右对字符进行判断,如果左边的数字不小于右边的数字,则加上对应的右边数字的值;如果发现左边的数字小于右边的数字,则加上右边数字数值并减去左边数字的两倍(计数规则2),程序如下:
class Solution:
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
roman_to_int_dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000}
last = result = roman_to_int_dict[s[0]]
for i in s[1:]:
new_int = roman_to_int_dict[i]
if last < new_int:
result += new_int - 2*last
else:
result += new_int
last = new_int
return result
为了加快程序的运行效率,程序中利用了python字符串本身可以进行循环的特性,从而减少相应的检索时间。