# 13.Roman to Integer <span class="tag" data-diff="easy" /> {%hackmd RN5D4nggQRO8wzNqxuvlNw %} ## 題目 Roman numerals are represented by seven different symbols: `I`, `V`, `X`, `L`, `C`, `D` and `M`. ``` Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000 ``` For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II. Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used: - I can be placed before V (5) and X (10) to make 4 and 9. - X can be placed before L (50) and C (100) to make 40 and 90. - C can be placed before D (500) and M (1000) to make 400 and 900. Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. **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: L = 50, V= 5, III = 3. ``` **Example 5:** ``` Input: "MCMXCIV" Output: 1994 Explanation: M = 1000, CM = 900, XC = 90 and IV = 4. ``` ## 思路 這一題是上一題的反向運算,一樣從羅馬數字的最後面開始parse,將答案加上該羅馬數字對應的值,另外,觀察諸如`9 (IX)`、`40 (XV)`之類的數字,皆可發現他們的第一位比第二位所代表的值還要小,顧可以推論,若在parse的途中,出現了一個較小的數字,該數字要被減掉。 ```javascript const symbol = "IVXLCDM".split(""); let ans = 0, index = 0; s.split("").reverse().map(x => { let i = symbol.indexOf(x), v = 10 ** Math.ceil(i / 2) / (i % 2 ? 2 : 1); ans += v * (i < index ? -1 : 1); index = Math.max(index, i); }); return ans; ```