LeetCode # 13 罗马数字转整数

LeetCode # 13 罗马数字转整数

思路 1

  • 利用字典记录对应关系
  • 遍历整个字符串
    • 查找前后两个字符是不是出现了特殊情况
    • 无特殊情况直接加

代码 1

class Solution:
    def romanToInt(self, s: str) -> int:
        res = 0
        Dict = {"I" : 1, "V" : 5, "X" : 10, "L" : 50, "C" : 100, "D" : 500, "M" : 1000, "IV": 4, "IX": 9, "XL": 40, "XC": 90, "CD":400, "CM": 900}
        i = 0
        while(i < len(s)):
            if( i != len(s) - 1 ):
                sx = s[i: i+2]
            else:
                sx = None
            if(Dict.get(sx) == None):
                res += Dict[s[i]]
            else:
                i += 1
                res += Dict[sx]
            i += 1
        return res        

代码精简版

class Solution:
    def romanToInt(self, s: str) -> int:
        d = {'I':1, 'IV':3, 'V':5, 'IX':8, 'X':10, 'XL':30, 'L':50, 'XC':80, 'C':100, 'CD':300, 'D':500, 'CM':800, 'M':1000}
        return sum(d.get(s[max(i-1, 0):i+1], d[n]) for i, n in enumerate(s))

作者:QQqun902025048
链接:https://leetcode-cn.com/problems/roman-to-integer/solution/2-xing-python-on-by-knifezhu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

改进思路

来源 LeetCode:
其实只要每次比较后一个和前一个的值的大小关系即可:
前值小于后值,减去前值
前值大于或等于后值,加上前值
最后一个值必然是加上的

class Solution:
    def romanToInt(self, s: str) -> int:
        d = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
        PreNum = d[s[0]]
        res = 0
        for i, sx in enumerate(s):
            val = d[sx]
            if(val > PreNum):
                res += val - 2*PreNum
            else:
                res += val 
            PreNum = val
        return res

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章