罗马数字转整数(python)

给定一个罗马数字,将其转换成整数
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。对应的数值关系分别如下:
'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 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。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/roman-to-integer

整体思路:首先将罗马数字对应的数值存储在一个字典中,其中key为罗马数字,value为罗马数字对应的数值。这样方便后续的计算。第二步,将字符串拆解为一个一个的元素存储在列表中,便于遍历。第三步,也是核心部分,判断罗马数字排列的位置,计算数值。理清计算过程中加的情况及减的情况。当左边的罗马数字对应的数值小于右边,为减。除此外的情况,均为加(加包含了 1.左边罗马数字大于等于右边罗马数字的数值;2.由于索引的关系最后一个列表中的最后一个元素)

涉及的点:字典查找、字符串转列表、索引

具体代码:

#采用先考虑加再考虑减的情况
s = 'III' #测试用例 罗马数s为III
# 定义字典,其中key为罗马数字的字符,value为罗马数字的数值
tmp = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
s1 = list(s)) #将输入的字符串转化为列表中的一个一个元素
result = 0 #定义接收变量
      for i in range(len(s1)):#遍历列表中的每一个元素
          if i+1 == len(s1) or i+1 < len(s1) and tmp[s1[i]] >= tmp[s1[i+1]]:#如果是最后一个元素,或者左边的元素对应的数值大于右边的话
                result +=tmp[s1[i]] #将左边的元素的数值累加到返回的变量result中
          else:  #排除两种加的情况后,计算相减的情况
                result -= tmp[s1[i]]
        return result #返回接收的变量

需要注意的地方,列表的索引(ME弄错了好几次)和列表长度的关系
对于for i in range (len(s1))来说,假设列表s1分长度是4,其索引分别为0、1、2、3,len(s1)是4,
错误总结:1)ME总是喜欢用sl[5] 犯超出索引值的错误,要取出s1的最后一个数字又不能犯超过索引的错误,可以定义令i+1 = len(s1),这样s1[i+1],便不会报错了。
为什么呢,i 是0、1、2、3; i+1 是1、2、3、4。

2)if 、else成对出现,包含所有的情况;

  1. 字符串转列表两种方法:一是list()函数,二是str.split( )方法(split括号里面可以是切分条件)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容