使用python 解罗马数字转整数

题目如下:

罗马数字包含以下七种字符: 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。
给定一个罗马数字,将其转换成整数。
 


第一种:使用字符串替换的方式

class Solution:def romanToInt(self, s: str):num_dic = {"I": 1, "V": 5, "L": 50, "M": 1000, "C": 100, "D": 500, "X": 10, "a": 4, "b": 9, "c": 40, "d": 90, "e": 400,"f": 900}# 将所有可能出现的罗马对应的数字列出special = {"IV": "a", "IX": "b", "XL": "c", "XC": "d", "CD": "e", "CM": "f"}# 针对者6种特殊情况,使用其他字符进行赋值S=sfor key, value in special.items():# dict.item() 返回的是一个列表,每一个列表中[(key,value),(key,value)]# 使用便利的方式获取所有的key 和valueif key in S: # 判断 当前这个key 是否在这个字符串中S = S.replace(key, value) # 如果存在,那么将原来的值用value来替换掉,就是IV变成了a,三次结果如下# MCMXCa# MCMda# Mfdanum_li=[ num_dic[i] for i in S ] # 使用列表推导式生成一个新的列表return sum(num_li) # 使用sum 函数将列表内部的值都进行累加S = "MCMXCIV"
print(Solution().romanToInt(S)) #1994

这种方法,参考了其他同学的解题思维,就是将里面特殊的值,用非罗马的字母进行替换,那么后期再次遍历的时候,就不会把这个值统计进去。代码中,我根据这个思维进行了一个优化

第二种:寻找特殊情况的规律,进行数值累加

class Solution:def romanToInt(self, s: str):num_dic = {"I": 1, "V": 5,"X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}special = ["IV", "IX", "XL", "XC", "CD","CM"]# 6 种特殊情况  IV =V-I    IX=X-I  然后由此推出这个值,就是后一个值-前一个值。而且后面那个值都是大于前面这个值n=len(s)# 需要知道字符串的长度,目的是为了通过下标来获取对应的值res=0 # 总值为0for i in range(n):# 因为range函数取头不取尾,所以不需要-1c=num_dic[s[i]] # 获取当前存在的值if (i 

最早的时候我并没有考虑到这6中特殊情况,所以只有部分正确,然后一直没有思路,就百度看了一下别人的解题方案,然后看到了这个差不多的代码,不过他并没有考虑到如果不是这6种情况时,有满足后一个值大于前面一个值。那么代码是存在问题的。我在原来的基础上进行的优化。

如果有更好的思路也希望大家可以补充补充


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部