leetcode 刷题记:13. 罗马数字转整数

罗马数字一直以来都是当科普学习的,毕竟阿拉伯数字比罗马数字更容易识别,这道题就是把罗马数字转阿拉伯数字

问题描述

给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

1
2
3
4
5
6
7
// @algorithm @lc id=13 lang=javascript 
// @title roman-to-integer
// @test("III")=3
// @test("IV")=4
// @test("IX")=9
// @test("LVIII")=58
// @test("MCMXCIV")=1994

解题思路

方法一

罗马数字有个比较让人烦恼的地方,就是有些数字是需要两个字母一起表示的。我们可以把两个字母的数字转换成单个字母,再进行数值运算。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* @param {string} s
* @return {number}
*/
const romanToInt = function(s) {
const map = new Map();
map.set("I", 1);
map.set("V", 5);
map.set("X", 10);
map.set("L", 50);
map.set("C", 100);
map.set("D", 500);
map.set("M", 1000);
map.set("A", 4);
map.set("B", 9);
map.set("Q", 40);
map.set("P", 90);
map.set("E", 400);
map.set("F", 900);
s = s.replace("IV", "A")
.replace("IX", "B")
.replace("XL", "Q")
.replace("XC", "P")
.replace("CD", "E")
.replace("CM", "F");
let result = 0;
for (let i = 0; i < s.length; i++) {
result += map.get(s[i]);
}
return result;
};

这就有点耍流氓了,但是我就是喜欢耍流氓。

方法二

当然也可以逐一对字符串进行解析。如果遇到I后面有V这种,就进行减I操作。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* @param {string} s
* @return {number}
*/
const romanToInt = function(s) {
const map = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000
};
let res = 0;
for (let i = 0; i < s.length; i++) {
if (map[s[i]] < map[s[i + 1]]) {
res -= map[s[i]];
} else {
res += map[s[i]];
}
}
return res;
};

这要是能goto就好了,不符合case里面的判断推荐直接到default。wtfjs 有保留字却没有实现goto功能。


leetcode 刷题记:13. 罗马数字转整数
https://bubao.github.io/posts/b6bcc477.html
作者
一念
发布于
2021年3月23日
许可协议