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

115 阅读2分钟

这里写目录标题

题目介绍

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


思路

举几个例子:

给出的罗马数字输出的值
I1
II2
III3
VI6
XII12
MVI1006

就此可以看出,把罗马数字每个字符单独拆分开来,转换成对应数字,再相加,就是最终结果。

但是,题目中给出了几种特殊情况

给出的罗马数字输出的值
IV4
IX9
XL40
XC90
CD400
CM900

对特殊情况举几个例子:

给出的罗马数字输出的值
CDVI406
CMIX909

可以得出一个结论:

当存在特殊情况时,字符不应该被拆分开,而是作为一个整体来转变成数字的。如果单独拆开得出对应的数字,再进行相加,只会得出错误的结果。

那么,我们就必须找一个字符来代替这个整体,用于最终数字计算。

比如用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;
};

提交结果

在这里插入图片描述