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

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