leetcode python3 简单题13. Roman to Integer

1.编辑器

我使用的是win10+vscode+leetcode+python3
环境配置参见我的博客:
链接

2.第十三题

(1)题目
英文:
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

中文:
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
(2)解法
① 使用dict.get(耗时:64ms,内存:13.6M)

class Solution:
    def romanToInt(self, s: str) -> int:
        dic = {'I':1, 'IV':4, 'V':5, 'IX':9, 'X':10, 'XL':40, 'L':50, 'XC':90, 'C':100, 'CD':400, 'D':500, 'CM':900, 'M':1000}
        return sum(dic.get(s[max(i-1, 0):i+1], dic[n]) for i, n in enumerate(s))

注意:
1.这里的dict是将所有的单字符,双字符组合的情况全部考虑了,如果不考虑双字符组合,那么程序会变得非常复杂,需要很多判断语句

② 双循环方法(耗时:156ms,内存:13.7M)

class Solution:
    def romanToInt(self, s: str) -> int:
        dic = {'IV':4, 'IX':9,'XL':40,'XC':90,'CD':400,'CM':900,'I':1, 'V':5,  'X':10,  'L':50,  'C':100,  'D':500,  'M':1000}
        flag=0
        res = 0
        lens = len(s)
        for key, val in dic.items():
            for i, char in enumerate(s):
                lenkey = len(key)
                if i<lens and s[i:i+lenkey]==key:
                    if lenkey==2:
                        flag=1
                    i+=lenkey
                    res+=val
            if lenkey==2 and flag==1:
                res-=sum([dic.get(i) for i in (key)])
                flag=0
        return res

注意:
1.最关键的点是flag的设置,因为dic和s的双循环存在,所以会造成dict中两个字符的组合会多算两次单个字符的和,所以要减去。
2.dic.items()这样枚举key-value对的时候是有顺序的,顺序就是dic中排列的顺序。
3.in enumerate会自动生成index,value,无论最后是否输出index,如果不给index留位置,则输出的是tuple类型(index,value)
4.str变量可以用for in的结构来得到每一个单一字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值