[LeetCode] 13. Roman to Integer

罗马数字转换整数。题意跟12题恰好相反。例子,

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.

这个题依然没什么算法和思想可言,思路依然是需要创建一个整数和罗马数字之间的mapping,然后从右往左遍历input字符串。当遍历到s[i]的时候,需要看一下s[i], cur和s[i - 1], pre位置上的罗马数字哪个对应的整数大,分如下几种情况,用例子说明,

如果s = "III",s[i] = s[i - 1] = "I"。此时pre === cur,只要把pre位置上代表的整数加到结果即可。这种case应该是只适用于s[i]是"I"的,因为没有其他字母可以这样重复出现,类似"XX"或者"VV"应该都是不合法的。

如果s = "IV",s[i] = "V", s[i - 1] = "I",此时pre < cur,需要把I的值从V减去(5-1 = 4)。

如果s = "VI",s[i] = "I", s[i - 1] = "V",此时pre >= cur,这种case同第一种case,需要将I的值和V的值相加(5 + 1 = 6)。

时间O(n)

空间O(n) - hashmap记录对应关系

 1 /**
 2  * @param {string} s
 3  * @return {number}
 4  */
 5 var romanToInt = function (s) {
 6     // corner case
 7     if (s === null || s.length === 0) {
 8         return 0;
 9     }
10 
11     // normal case
12     const map = new Map([['I', 1], ['V', 5], ['X', 10], ['L', 50], ['C', 100], ['D', 500], ['M', 1000]]);
13     let i = s.length - 1;
14     let res = map.get(s[i]);
15     while (i > 0) {
16         let cur = map.get(s[i]);
17         let pre = map.get(s[i - 1]);
18         if (pre >= cur) {
19             res += pre;
20         } else {
21             res -= pre;
22         }
23         i--;
24     }
25     return res;
26 };

猜你喜欢

转载自www.cnblogs.com/aaronliu1991/p/12239512.html