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的结构来得到每一个单一字符。