LeetCode_Everyday:013 Roman to Integer

LeetCode_Everyday:013 Roman to Integer


LeetCode Everyday:堅持價值投資,做時間的朋友!!!

題目:

羅馬數字包含以下七種字符: I,V,X,L,C,D, M

字符          數值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 羅馬數字 2 寫做 II ,即爲兩個並列的 1。12 寫做 XII ,即爲 X + II 。 27 寫做 XXVII, 即爲 XX + V + II 。
通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 IIII,而是 IV。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示爲 IX。這個特殊的規則只適用於以下六種情況:

  • I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。

給定一個整數,將其轉爲羅馬數字。輸入確保在 1 到 3999 的範圍內。

示例:

  • 示例 1:
    輸入: "III"
    輸出: 3
    
  • 示例 2:
    輸入: "IV"
    輸出: 4
    
  • 示例 3:
    輸入: "IX"
    輸出: 9
    
  • 示例 4:
    輸入: "LVIII"
    輸出: 58
    解釋: L = 50, V= 5, III = 3.
    
  • 示例 5:
    輸入: "MCMXCIV"
    輸出: 1994
    解釋: M = 1000, CM = 900, XC = 90, IV = 4.
    

代碼

方法一: 哈希表 題注

執行用時 :72 ms, 在所有 Python3 提交中擊敗了29.84%的用戶
內存消耗 :13.6 MB, 在所有 Python3 提交中擊敗了6.45%的用戶

思路:

  • 構建一個字典記錄所有羅馬數字子串,注意長度爲2的子串記錄的值是(實際值 - 子串內左邊羅馬數字代表的數值)

  • 這樣一來,遍歷整個 s 的時候判斷當前位置和前一個位置的兩個字符組成的字符串是否在字典內,如果在就記錄值,不在就說明當前位置不存在小數字在前面的情況,直接記錄當前位置字符對應值

  • 舉個例子,遍歷經過 IV 的時候先記錄 I 的對應值 1 再往前移動一步記錄 IVIV 的值 3,加起來正好是 IV 的真實值 4。max 函數在這裏是爲了防止遍歷第一個字符的時候出現 [-1:0][−1:0] 的情況


class Solution:
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: 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))
    
"""
For Example:    input:   s = "MCMXCIV"
               output:   1994
"""
s = "MCMXCIV"
                
solution = Solution()
result = solution.romanToInt(s)
print('輸出爲:', result)    # 1994

方法二: 哈希表的另一種方式 題注

執行用時 :60 ms, 在所有 Python3 提交中擊敗了71.15%的用戶
內存消耗 :13.5 MB, 在所有 Python3 提交中擊敗了6.45%的用戶

class Solution:
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        ref = {'I':1,
               'V':5,
               'X':10,
               'L':50,
               'C':100,
               'D':500,
               'M':1000
               }
        if not s:
            return 0
        res = ref[s[0]]
        for i in range(1, len(s)):
            prev = s[i-1]
            cur = s[i]
            if prev and ref[prev] < ref[cur]:
                res += (ref[cur] - 2*ref[prev])
            else:
                res += ref[cur]
        return res
    
"""
For Example:    input:   s = "MCMXCIV"
               output:   1994
"""
s = "MCMXCIV"
                
solution = Solution()
result = solution.romanToInt(s)
print('輸出爲:', result)   # 1994

參考

  1. https://leetcode-cn.com/problems/roman-to-integer/solution/2-xing-python-on-by-knifezhu/
  2. https://www.bilibili.com/video/BV17c411h7M5

此外

  • 原創內容轉載請註明出處
  • 請到我的GitHub點點 star
  • 關注我的 CSDN博客
  • 關注我的嗶哩嗶哩
  • 關注公衆號:CV伴讀社

在這裏插入圖片描述

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