算法刷题5、第13题 罗马数字转整数

在这里插入图片描述
在这里插入图片描述
代码

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值