1. 程式人生 > >Leetcode演算法——13、羅馬數字轉整數

Leetcode演算法——13、羅馬數字轉整數

題目

要求給定一個羅馬數字,將其轉為整數。整數的範圍為 1 ~ 3999。

羅馬數字可以由7個符號來表示: 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前面,所以我們需要減去1。類似的例子有9,羅馬數字為IX。一共有6種減法情況:

  • IV = 4
  • IX = 9
  • XL = 40
  • XC = 90
  • CD = 400
  • CM = 900

示例: Example 1: Input: “III” Output: 3

Example 2: Input: “IV” Output: 4

Example 3: Input: “IX” Output: 9

Example 4: Input: “LVIII” Output: 58 Explanation: C = 100, L = 50, XXX = 30 and III = 3.

Example 5: Input: “MCMXCIV” Output: 1994 Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

思路

從左向右掃描,掃描步長為1,掃描範圍為2。

注意:要考慮到6個減法情況。這也是為什麼掃描範圍為2的原因。一旦後面的字元比當前字元大,說明屬於6個減法情況之一。

python實現

def romanToInt(s):
    """
    :type s: str
    :rtype: int
    從左向右掃描,掃描步長為1,掃描範圍為2。要考慮到6個減法情況。    
    """
    
    romans = {'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}
    result = 0
    i =
0 max_len = len(s) while(i < max_len): if s[i:i+2] in romans: result += romans[s[i:i+2]] i += 2 else: result += romans[s[i]] i += 1 return result if '__main__' == __name__: num = 'MCMXCIV' print(romanToInt(num))