题目描述:
- 罗马数字包含以下的七种字符:
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
解析:L = 50, V= 5, III = 3.
示例5:
输入:“MCMXCIV”
输出:1994
解析:M = 1000, CM = 900, XC = 90,IV = 4.
算法设计与分析:
-
这里使用python3就很快。
-
方法一:罗马数字的符号总的来说就不多,数值的大小全部依靠拼接来组成,总的字符有:
I
,V
,X
,L
,C
,D
,M
,其中位于段内1~5, 5~10, 10~50, 50~100, 100~500, 500~1000之内的数字都要依靠拼接,当符号I
,X
,C
位于大于它们的数的后面的时候就作为加数,位于前面的时候就作为减数,使用字典可以将它们对应的值列举出来,这样操作字典就可以直接获取到它们对应的值,使用上面的原则就可以得到下面的伪代码:- 1、列举出他们对应的字典,并初始化转换的结果result=0
- 2、对于传入的罗马字符串s,使用(字典、列表、元组)的迭代函数enumerate对字典进行迭代,获取每个字符的索引值(默认从0开始)和字符。
- 3、初始化参数value,然后根据s对应的字符串查找字典,更新value的值如果到最后的一个值就直接赋值为0
- 4、判断传入的s罗马字符串是否有下一个,加1和s的长度比较,然后根据获取到的字符再查询字典,并获取到罗马字符对应的值
- 5、判断下一个值是否比当前值大,如果大于当前值,value就需要取反(取负数)
- 6、对转换之后的值 逐个添加到result中:左减右加
- 7、循环迭代,返回第二步,直到取到末尾的值
- 8、返回结果result
-
方法二:使用罗马字符的组合的特殊性,除了一些单个字符表示的基础的数字之外,例如
I
,V
,X
,L
,C
,D
,M
分别表示1,5,10,50,100,500,1000之外,还用一些特殊的组合,例如IV
,IX
,XL
,XC
,CD
,CM
分别表示4,9,40,90,400,900,他们组合起来表示其他的所有的数字,因为其特殊性,不会组合产生歧义(前提是传入的罗马数字是规范的),所以可以使用字符串的处理方法对其中的一些字符串进行处理,将上面的基础的字符和组合的字符使用字典存放起来,并定义一个空列表numlist,然后查询字符串中是否有相应的组合。如果有对应的组合,就查询字典,获取到对应的数值并将这些数值append到numlist中去,最后迭代numlist列表,将里面的数全部加起来就可以得到罗马字符转换的整数,有如下的伪代码:- 1、将所有的符号对应的值使用字典存储起来
- 2、初始化结果的值num和空的列表numlist
- 3、逐个对传入的罗马字符串中的字符进行替换,并将对应的字符append到列表里面。
- 4、遍历字符串s,将剩下来的单个没有被转换的字符进行转换,并将字符对应的值append到numlist里面去
- 5、遍历得到的numlist,将里面的值相加起来就得到最后的结果num
- 6、返回num,函数结束。
-
使用python3对方法一进行描述:
class Solution:
def romanToInt(self, s: str) -> int:
dic = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500,"M":1000}
result = 0
for idx, ch in enumerate(s):
value = 0
if dic[ch] is not None:
value = dic[ch]
if idx + 1 < len(s):
nextCh = s[idx + 1]
nextValue = dic[nextCh]
if nextValue is not None and nextValue > value:
value = value * -1
result += value
return result
- 使用Python3对方法二进行描述:
class Solution:
def romanToInt(self, s: str) -> int:
dict = {"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000,"IV":4,"IX":9,"XL":40,"XC":90,"CD":400,"CM":900}
num = 0
numlist = []
if "CM" in s:numlist.append(900);s = s.replace("CM","900")
if "CD" in s:numlist.append(400);s = s.replace("CD","400")
if "XC" in s:numlist.append(90);s = s.replace("XC","90")
if "XL" in s:numlist.append(40);s = s.replace("XL","40")
if "IX" in s:numlist.append(9);s = s.replace("IX","9")
if "IV" in s:numlist.append(4);s = s.replace("IV","4")
for i in s:
# 如果该数对应的在字典里面的时候才加的,否则不加,题目已经给出了范围
if dict.get("%s"%i):
numlist.append(dict.get("%s"%i))
for i in numlist:
num += i
return num