这里写目录标题
-
-
-
- 题目介绍
- 思路
- 代码
- 提交结果
-
-
题目介绍



思路
举几个例子:
| 给出的罗马数字 | 输出的值 |
|---|---|
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;
};
提交结果
