13. Roman to Integer

沐芓李發表於2017-05-23

題目描述

Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.

給定一個羅馬數字,把它轉換為一個整數。
輸入被保證在 1 到 3999 之間。

原文地址

思路方法

羅馬數字的規則詳細見帖子下方。
可以很簡單去思考這個規則,就是對於輸入的羅馬數字字串,從後向前掃描,遇到前面數大於等於後面的最大數的時候,相加;遇到前面數小於後面的最大數的時候,相減。

class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        dic = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
        result = 0
        maxDigit = 1

        for i in range(len(s)-1, -1, -1):
            if dic[ s[i] ] >= maxDigit:
                #存放已經掃描過的最大數值
                maxDigit = dic[ s[i] ]
                result = result + dic[ s[i] ]
            else:
                result = result - dic[ s[i] ]

        return result

知識點

羅馬數字拼寫規則
羅馬數字共有 7 個,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)。按照下述的規則可以表示任意正整數。需要注意的是羅馬數字中沒有 “0”,與進位制無關。一般認為羅馬數字只用來記數,而不作演算。

  • 重複數次:一個羅馬數字重複幾次,就表示這個數的幾倍。
  • 右加左減:
    • 在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字。
    • 在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字減小數字。
    • 左減的數字有限制,僅限於 I、X、C。比如 45 不可以寫成 VL,只能是 XLV
    • 但是,左減時不可跨越一個位值。比如,99 不可以用 IC( {\displaystyle 100-1} 100-1)表示,而是用 XCIX( {\displaystyle [100-10]+[10-1]} [100-10]+[10-1])表示。(等同於阿拉伯數字每位數字分別表示。)
    • 左減數字必須為一位,比如 8 寫成 VIII,而非 IIX。
    • 右加數字不可連續超過三位,比如 14 寫成 XIV,而非 XIIII。(見下方 “數碼限制” 一項。)
  • 加線乘千:
    • 在羅馬數字的上方加上一條橫線或者加上下標的Ⅿ,表示將這個數乘以 1000,即是原數的 1000 倍。
    • 同理,如果上方有兩條橫線,即是原數的 1000000( {\displaystyle 1000{2}} 1000{{2}})倍。
  • 數碼限制:
    • 同一數碼最多隻能連續出現三次,如 40 不可表示為 XXXX,而要表示為 XL。
    • 例外:由於 IV 是古羅馬神話主神朱庇特(即 IVPITER,古羅馬字母裡沒有 J 和 U)的首字,因此有時用 IIII 代替 IV。

range()

>>> range(1, 5)    #從1 到 5 ,但是不包含5
[1, 2, 3, 4]
>>> range(1, 5, 2)   #從1 到 5,間隔是2,不包含5
[1, 3]
>>> range(5)    #從 0 到 5,不包含5
[0, 1, 2, 3, 4]

相關文章