1、题目描述
目录
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。例如, 罗马数字 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。
给定一个罗马数字,将其转换成整数。
2、题目解答
(1)方法一
leecode官方代码思路:
函数首先定义一个字典 roman_map
,用于将罗马数字映射到整数上;再定义一个字典 special_map,
将罗马数字的特殊组合映射到整数上;然后初始化一个变量 res
,表示罗马数字的整数值。
接下来使用 while
循环遍历罗马数字的每一位。如果当两位为罗马数字特殊组合,则将当前的值加到result
中,并向下移动两位。否则,直接将当前一位的值加到 result
中,并向下移动一位。
在循环结束时,返回 result
的值,即为罗马数字所代表的整数值。代码如下:
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
roman_map = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
special_map = {'IV':4,'IX':9,'XL':40,'XC':90,'CD':400,'CM':900}
res = 0
i = 0
while i < len(s):
if i+1<len(s) and s[i:i+2] in special_map:
res += special_map[s[i:i+2]]
i += 2
else:
res += roman_map[s[i]]
i += 1
return res
(2)方法二
这个函数的输入参数 s
是一个字符串,代表罗马数字。返回值是一个整数,表示罗马数字所代表的整数值。
函数首先定义了一个字典 roman_dict
,用于将罗马数字映射到整数上。然后初始化一个变量 result
,表示罗马数字的整数值。
接下来使用 while
循环遍历罗马数字的每一位。如果当前位比下一位的值小,则将下一位的值减去当前位的值,并将结果加到 result
中。否则,将当前位的值加到 result
中,并向下移动一位。
在循环结束时,返回 result
的值,即为罗马数字所代表的整数值。代码如下:
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
# 定义一个字典
roman_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
result=0
i=0
while i<len(s):
if i+1<len(s) and roman_dict[s[i]]<roman_dict[s[i+1]]:
result+=roman_dict[s[i+1]]-roman_dict[s[i]]
i+=2
else:
result+=roman_dict[s[i]]
i+=1
return result