给定一个罗马数字,将其转换成整数
例如, 罗马数字 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成对出现,包含所有的情况;
- 字符串转列表两种方法:一是list()函数,二是str.split( )方法(split括号里面可以是切分条件)