前端算法-罗马数字转整数

168 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

题目

罗马数字包含以下七种字符: I, V, X, LCD 和 M。给定一个罗马数字,将其转换成整数。


字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

输入: s = "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

题解

由于我们这里是将罗马数字转换为整数,但是在罗马数字中有一些粘连的罗马数字,比如IV这是两个罗马数字但是IV这是一个罗马数字,如果直接进行转换很容易发生转换成错误的整数,所以我们这里使用正则的replace方法将粘连的罗马数字转换为小写字母以便于做区分,转换完成后我们在赋值给出参s,在声明一个变量res用于合并罗马数字转为整数后的值,声明一个函数getVlaue接受一个入参x,这个入参我们需要传递罗马数字和将黏连罗马数字转换后的小写字母,里面使用switch进行做出匹配,匹配到对应的罗马数字或者小写字母返回其对应的整数,接下来我们使用for循环进行循环出参s,在循环中我们声明一个变量num,然后将循环中的值传递给getVlaue使其返回对应的整数,我们将返回的整数赋值给num,在使用res变量和num进行相加并将相加后的值重新赋值给res,当循环结束后,我们将res变量返回出去即可

/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
    s = s.replace('IV','a');
    s = s.replace('IX','b');
    s = s.replace('XL','c');
    s = s.replace('XC','d');
    s = s.replace('CD','e');
    s = s.replace('CM','f');
    let res = 0
    for(let i = 0;i < s.length;i++){
        let num=getVlaue(s.[i])
        res = res + num
    }
    return res
};
function getVlaue(x){
    switch(x){
        case 'I':
        return 1;
        case 'V':
        return 5;
        case 'X':
        return 10;
        case 'L':
        return 50;
        case 'C':
        return 100;
        case 'D':
        return 500;
        case 'M':
        return 1000;
        case 'a':
        return 4;
        case 'b':
        return 9;
        case 'c':
        return 40;
        case 'd':
        return 90;
        case 'e':
        return 400;
        case 'f':
        return 900;
    }
}

坚持努力,无惧未来!