leetcode 算法题013 (简单004) 罗马数字转整数
- 题目介绍
罗马数字包含以下七种字符: 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 的范围内。
- 示例
输入: “III”
输出: 3
输入: “IV”
输出: 4
输入: “IX”
输出: 9
输入: “LVIII”
输出: 58
解释: L = 50, V= 5, III = 3.
输入: “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
- 解法一
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function(s) {
let i = 0;
let temp = 0;
while (i < s.length) {
switch (s[i]) {
case "V":
temp += 5;
break;
case "L":
temp += 50;
break;
case "D":
temp += 500;
break;
case "M":
temp += 1000;
break;
case "I":
if (s[i + 1] === "V") {
temp += 4;
i++;
break;
}
if (s[i + 1] === "X") {
temp += 9;
i++;
break;
}
temp += 1;
break;
case "X":
if (s[i + 1] === "L") {
temp += 40;
i++;
break;
}
if (s[i + 1] === "C") {
temp += 90;
i++;
break;
}
temp += 10;
break;
case "C":
if (s[i + 1] === "D") {
temp += 400;
i++;
break;
}
if (s[i + 1] === "M") {
temp += 900;
i++;
break;
}
temp += 100;
break;
}
i++;
}
return temp;
};
执行用时 : 216 ms, 在所有 JavaScript 提交中击败了93.16%的用户
内存消耗 : 39.6MB, 在所有 JavaScript 提交中击败了89.09%的用户
- 解法二
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function(s) {
const dict = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
a: 4,
b: 9,
c: 40,
d: 90,
e: 400,
f: 900
}
s = s.replace(/IV/g,'a').replace(/IX/g,'b').replace(/XL/g,'c').replace(/XC/g,'d').replace(/CD/g,'e').replace(/CM/g,'f');
let i = 0, temp = 0;
while(i < s.length) {
temp += dict[s[i++]];
}
return temp;
};
执行用时 : 240 ms, 在所有 JavaScript 提交中击败了68.76%的用户
内存消耗 : 40.0MB, 在所有 JavaScript 提交中击败了23.86%的用户
- 解法三
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function(s) {
const dict = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000
};
let i = 0,
temp = 0,
flag = 0;
while (i < s.length) {
let current = dict[s[i++]];
if(flag && current > flag) {
temp -= 2 * flag;
flag = 0;
} else {
if([1,10,100].indexOf(current) > -1) {
flag = current
} else {
flag = 0;
}
}
temp += current;
}
return temp;
};
执行用时 : 240 ms, 在所有 JavaScript 提交中击败了68.74%的用户
内存消耗 : 40 MB, 在所有 JavaScript 提交中击败了64.82%的用户