题目及要求
罗马数字包含以下七种字符: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.尝试方法一
在看到题目的时候,我首先想到的是可以用字典的键值对将字符和数值一一对应,然后现将任意字符的所有的数相加起来,再去减去特殊的值对应的差值。
class Solution:
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
dict = {
'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000,
'IV': 2, 'IX': 2,
'XL': 20, 'XC': 20,
'CD': 200, 'CM': 200
} #把罗马数字对应的值列出来
lis1=['IV','IX','XL','XC','CD','CM']#把特殊值列表出来
m = 0
for i in range(len(s)):
m = m + dict[s[i]] # 先算出m的总值,2216
# print(m)
for i in lis1:
try:
exist1=s.index(i)#首先判断输入的值里面是否存在特殊
num1=dict[i]
m=m-num1
return m
except:
num1=0
m=m-num1
return m在运行了以上编码之后,我发现了一个问题,我在pycharm上面用s=input()然后,验证IX,发现输出的结果为11,这个就很奇怪了,因为这表明IX不在s里面,可事实上它就是在里面,然后我发现可能是因为是列表的原因,所以出现了substring not found的错误。
然后我再尝试了很多遍之后,突然想起来,可不可以用键值对来做???然后验证IX是否在dict里面?,然后运行返回的结果是true,所以我把列表删除了,改成了dict的形式。
以下是最终的编码,终于通过了。对比了一下这两个编码,我发现第二个编码更为简洁和优化一些。最主要是最后在return的位置,比一个好一点。好了,不多说了,直接上代码。
class Solution:
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
m1=0
m2=0
dict = {
'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000,
# 'IV': 2, 'IX': 2,
# 'XL': 20, 'XC': 20,
# 'CD': 200, 'CM': 200
} # 把罗马数字对应的值列出来
dict2={
'IV': 2, 'IX': 2,
'XL': 20, 'XC': 20,
'CD': 200, 'CM': 200
}
# lis1 = ['IV', 'IX', 'XL', 'XC', 'CD', 'CM'] # 把特殊值列表出来
for i in dict2.keys():
if i in s:
num1=dict2[i]
m1=m1+num1
for i in s:
num2=dict[i]
m2=m2+num2
return m2-m1
再最后来个截图,




本文介绍了一种将罗马数字转换为整数的有效算法。利用字典映射罗马字符到其数值,并通过特殊规则处理例外情况,实现了准确的转换。
7万+

被折叠的 条评论
为什么被折叠?



