罗马数字一直以来都是当科普学习的,毕竟阿拉伯数字比罗马数字更容易识别,这道题就是把罗马数字转阿拉伯数字
问题描述
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
解题思路
方法一
罗马数字有个比较让人烦恼的地方,就是有些数字是需要两个字母一起表示的。我们可以把两个字母的数字转换成单个字母,再进行数值运算。
代码:
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
|
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
|
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
功能。