2021.11.16 每天进步一点点:力扣算法题13

这里写目录标题

        • 题目介绍
        • 思路
        • 代码
        • 提交结果

题目介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


思路

举几个例子:

给出的罗马数字 输出的值
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;
};

提交结果

在这里插入图片描述