代码:
class Solution:
def romanToInt(self, s: str) -> int:
a = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
ans=0
for i in range(len(s)):
if i<len(s)-1 and a[s[i]]<a[s[i+1]]:
ans-=a[s[i]]
else:
ans+=a[s[i]]
return ans
结果:
提炼:
1.罗马数字中小的数字在大的数字的右边
2.例如 4 不写做 IIII,而是 IV
3.数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值
思路:
1.创建hashMap字典表映射罗马数字和整数。
2.如果当前字符代表的值不小于其右边,就加上该值;否则就减去该值。
解读:(例如 s = “IV”)
Debug第一次循环:
len(s) 表示:len("IV")长度是2
range(len(s)) 表示:从0开始到2结束,不包括2,所以i拿到的值依次为0、1
i < len(s) - 1 表示:如果 0 < 2-1,满足条件为True
s[i] 表示第一个数,也就是 I
a[s[i]] 表示I对应的就是字典中的数字1
s[i+1] 表示第二个数,也就是 V
a[s[i+1]] 表示V对应字典中的数字5
==========第一次走的是if语句 是True==
ans -= a[s[i]] 表示 0 - 1 = (-1)
==========所以没走else语句==========
Debug第二次循环:
len(s) - 1 现在是 1 - 1 = 0
i < len(s) - 1 现在是 1 < 0 为False不满足条件,and后面可以不用看,为了详细,后面的and一起说明一下
s[i] 现在的值是 s[1] = V; 因为s = "IV",下标为1是V
a[s[i]]现在的是值是 a[V] = 5
s[i+1]现在的值是 s[2],s="IV"下标值为(0,1),很明显没有2,下标越界。
ans = ans + a[s[i]] 表示 -1 + 5 = 4
==========第二次if语句是False==
==========所以直接走的else语句==========
ans = ans + a[s[i]] 表示 -1 + 5 = 4