题目介绍
思路
举几个例子:
给出的罗马数字 | 输出的值 |
---|---|
I | 1 |
II | 2 |
III | 3 |
VI | 6 |
XII | 12 |
MVI | 1006 |
就此可以看出,把罗马数字每个字符单独拆分开来,转换成对应数字,再相加,就是最终结果。
但是,题目中给出了几种特殊情况
:
给出的罗马数字 | 输出的值 |
---|---|
IV | 4 |
IX | 9 |
XL | 40 |
XC | 90 |
CD | 400 |
CM | 900 |
对特殊情况举几个例子:
给出的罗马数字 | 输出的值 |
---|---|
CDVI | 406 |
CMIX | 909 |
可以得出一个结论:
当存在特殊情况时,字符不应该被拆分开,而是作为一个整体
来转变成数字的。如果单独拆开得出对应的数字,再进行相加,只会得出错误的结果。
那么,我们就必须找一个字符
来代替这个整体
,用于最终数字计算。
比如用n
来代替CD
,那么 CDVI
就可以写作nVI
。
这时候的n
就是400,就可以逐个字符拆开来,再相加,得出最终结果。
代码
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function(s) {
// 把所有特殊情况的整体字符串,都替换成单个字符
let st =
s.replace(/III/g, 'r')
.replace(/II/g, 'k')
.replace(/IV/g, 'a')
.replace(/IX/g, 'b')
.replace(/XL/g, 'f')
.replace(/XC/g, 'h')
.replace(/CD/g, 'n')
.replace(/CM/g, 'y');
// 把字符串转换成数字
const trans = function(str) {
switch(str) {
case 'I':
return 1;
case 'k':
return 2;
case 'r':
return 3;
case 'a':
return 4;
case 'V':
return 5;
case 'b':
return 9;
case 'X':
return 10;
case 'f':
return 40;
case 'L':
return 50;
case 'h':
return 90;
case 'C':
return 100;
case 'n':
return 400;
case 'D':
return 500;
case 'y':
return 900;
case 'M':
return 1000;
default:
return 0;
}
}
// 遍历相加
let result = 0;
for(let v of st) {
result += trans(v);
}
// 返回结果
return result;
};