# 13. Roman to Integer ## 題目概要 羅馬數字由七個不同的字符表示 :I、V、X、L、C、D和 M ``` Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000 ``` 例如, 2寫成 II、12寫成 XII, 就是 X + II。27 寫為 XXVII,即 XX + V + II。 羅馬數字通常從左到右從大到小寫。但是,四的數字不是IIII,而是寫為IV。因為 I 在 V 之前,所以我們用 5 - 1 得到 4。同樣的原理也適用於數字九,寫成 IX。 有六個使用減法的情況: I 可以放在 V(5) 和 X(10) 之前,組成 4 和 9。 X 可以放在 L(50) 和 C(100) 之前,組成 40 和 90。 C 可以放在 D(500) 和 M(1000) 之前,組成 400 和 900。 輸入為羅馬數字,我們須將其轉換為整數。 ``` Example 1: Input: s = "III" Output: 3 Explanation: III = 3. Example 2: Input: s = "LVIII" Output: 58 Explanation: L = 50, V= 5, III = 3. Example 3: Input: s = "MCMXCIV" Output: 1994 Explanation: M = 1000, CM = 900, XC = 90 and IV = 4. ``` ## 解題技巧 - 題目已經說得很清楚,我們須左至右遍歷羅馬數字,若當前的羅馬數字比下一個羅馬數字還要大就直接相加,若比較小就減去當前的數。為什麼是減去當前的數呢?以 IV 為例,I(1) < V(5),所以減去 1,接著 V 是最後一個羅馬數字,直接相加,所以為 -1 + 5 = 4。 ## 程式碼 ```javascript= /** * @param {string} s * @return {number} */ var romanToInt = function(s) { const map = { 'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000 } let result = 0; for(let i = 0; i < s.length; i++) { if (map[s[i]] < map[s[i + 1]]) { result -= map[s[i]]; } else { result += map[s[i]]; } } return result; }; ``` ![](https://i.imgur.com/7ZvWeNz.png)