题目
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M;给定一个罗马数字,将其转换成整数;输入确保在 1 到 3999 的范围内。
示例1
1 | 输入:'III' |
示例2
1 | 输入:'IV' |
示例3
1 | 输入:"MCMXCIV" |
思路
在第9节记录了整数转罗马字符数字,在这个过程中主要是通过将罗马数字和几个特殊的规则进行处理,将整数的个、十、百、千位用数组进行记录处理,最终将整数算出的值进行比对取值拼接而成;那么,反过来将罗马数字转换成整数的过程中该怎么处理呢?首先,从前向后进行逐位截取,将截取的罗马值与定义好的罗马字符对应的数值进行比对并取出即得到该值;正常情况下都能拿到对应的值,但是罗马数值的几种特殊规则(‘IV,IX,XL,XC,CD,CM’)怎么处理成了问题,举个例子参考一下,例如 ‘XIV’(14),在将该罗马数字转换成数字的过程中,将其进行逐位截取存储到数组A并计算数值:第一位 X(10),第二位 I(1),第三位 V(5),最终的结果是 A0 + A1 + A2 - A1 * 2,这样就可以处理特殊规则的值了。
CODE1
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
function romanToInt(data) {
const dataArr = data.split(''),
romanStrRelativeIntNumObj = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
};
let romanToIntEndNum = parseInt(romanStrRelativeIntNumObj[dataArr[0]]);
for (let i = 1; i < dataArr.length; i++) {
const curRomanStrNum = parseInt(romanStrRelativeIntNumObj[dataArr[i]]),
curPreRomanStrNum = parseInt(romanStrRelativeIntNumObj[dataArr[i - 1]]);
romanToIntEndNum += curRomanStrNum;
if (curPreRomanStrNum < curRomanStrNum) {
romanToIntEndNum -= curPreRomanStrNum * 2;
}
}
if (romanToIntEndNum < 1 || romanToIntEndNum > 3999) {
return;
}
return romanToIntEndNum;
}
总结
通过整数转罗马值和罗马值转整数两个算法,将罗马值和整数的关系整理了一遍,发现只要将数值的对应关系进行正确处理,计算其值并不麻烦。