LeetCode 13.Roman to Integer (羅馬數字轉整數)
阿新 • • 發佈:2018-12-10
題目描述:
羅馬數字包含以下七種字元: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
IX
。這個特殊的規則只適用於以下六種情況:
I
可以放在V
(5) 和X
(10) 的左邊,來表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左邊,來表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左邊,來表示 400 和 900。
給定一個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 的範圍內。
示例:
輸入: "IV"
輸出: 4
輸入: "LVIII" 輸出: 58 解釋: C = 100, L = 50, XXX = 30, III = 3.
輸入: "MCMXCIV"
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.
Accepted C++ Solution:
從後往前轉換,例如第i位,大於i+1位,則加上該位對應的數;若小於後一位,則減去當前位對應的數!
例如:CMXCIX
此時轉換過程為:10 - 1 + 100 -10 + 1000 - 100 = 999
class Solution { public: int romanToInt(string s) { unordered_map<char,int> T = { {'I',1}, {'V',5}, {'X',10}, {'L',50}, {'C',100}, {'D',500}, {'M',1000} }; int sum = T[s.back()]; for (int i = s.size()-2; i >= 0; i--) { if (T[s[i]] < T[s[i+1]] ) sum -= T[s[i]]; else sum += T[s[i]]; } return sum; } };