标签:targe ase UNC 对应关系 corn ring 重复 lse hashmap
罗马数字转换整数。题意跟12题恰好相反。例子,
Example 1:
Input: "III" Output: 3Example 2:
Input: "IV" Output: 4Example 3:
Input: "IX" Output: 9Example 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 };
[LeetCode] 13. Roman to Integer
标签:targe ase UNC 对应关系 corn ring 重复 lse hashmap
原文地址:https://www.cnblogs.com/aaronliu1991/p/12239512.html