Roman to Integer 羅馬數字轉整數
阿新 • • 發佈:2018-12-19
羅馬數字包含以下七種字元: 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.
思路:羅馬數字轉為阿拉伯數字,如果按照題目中給定的規則,我們需要判斷當前訪問的字元是否滿足前面6種情況,如果不滿足,就正常加,如果滿足就加6種特殊的情況。
參考程式碼:
class Solution { public: int romanToInt(string s) { map<char, int> m; m['I'] = 1; m['V'] = 5; m['X'] = 10; m['L'] = 50; m['C'] = 100; m['D'] = 500; m['M'] = 1000; int res = 0; for (int i = 0; i < s.size();i++) { if (s[i] == 'I' && (i + 1) < s.size()) { if (s[i + 1] == 'V') { res += 4; i = i + 1; continue; } if (s[i + 1] == 'X') { res += 9; i = i + 1; continue; } } if (s[i] == 'X' && (i + 1) < s.size()) { if (s[i + 1] == 'L') { res += 40; i = i + 1; continue; } if (s[i + 1] == 'C') { res += 90; i = i + 1; continue; } } if (s[i] == 'C' && (i + 1) < s.size()) { if (s[i + 1] == 'D') { res += 400; i = i + 1; continue; } if (s[i + 1] == 'M') { res += 900; i = i + 1; continue; } } res += m[s[i]]; } return res; } };
思路二:這道題其實沒有說清楚羅馬數字的規則:
V 和X 左邊的小數字只能用Ⅰ。
L 和C 左邊的小數字只能用X。
D 和M 左邊的小數字只能用C。
這意味著我們可以從字串右邊向左累加,如果左邊數字比右邊數字小,就減去左邊數字對應的數值,否則就正常的加上對應的數值。
參考程式碼:
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.length() - 2; i >= 0; --i)
{
if (T[s[i]] < T[s[i + 1]])
{
sum -= T[s[i]];
}
else
{
sum += T[s[i]];
}
}
return sum;
}