Leetcode演算法——13、羅馬數字轉整數
阿新 • • 發佈:2018-12-14
題目
要求給定一個羅馬數字,將其轉為整數。整數的範圍為 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))