罗马数字转整数

530 阅读1分钟

image.png

image.png

image.png

刚开始看到这道题的时候,我的思路历程大概如下:

1.把罗马数字映射成对应的数字

    const romanMap = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000
    };

2.我想着2个数字自动变为一组,初始化一个num=0,用来接收最后的结果,然后记录一个prev前面的数字,然后当数字跳到偶数次的时候,把prev重置为0,代码如下

 var num = 0;
    var prev = 0;
    for (let i = 0; i < s.length; i++) {
        if (i % 2 == 0) {
            prev = 0;
            num += map[s[i]];
        }else{
            if (prev <= map[s[i]]) {
                num -= map[s[i]];
            }else{
                num += map[s[i]];
            }
        }
        prev = map[s[i]];

    }

上面的代码在下面连个测试用例还能跑得过,

romanToInt("III")
romanToInt("LVIII")

但是romanToInt("MCMXCIV")就跑不过了。

我发现MC变成结果相加了,这肯定是不符合结果的。。。一切又要推到重来了

想了很久(是的,我很菜,各位观众就当看文章的时候,看菜鸡互啄就好了),发现其实这个问题,可以简化为字符串分组的问题,比如

MCMXCIV 分为M CM XC IV,分完组后,循环的次数也要减少了,需要跳过合并后的一次循环,加的结果,就是组内的数字,比较大小后,相减的结果

var romanToInt = function (s) {
    var num = 0;
    for (let i = 0; i < s.length; i++) {
        const nextValue = map[s[i + 1]];
        const currentValue = map[s[i]];
        if (nextValue > currentValue) {
            num += nextValue - currentValue;
            i++
        } else {
            num += currentValue;
        }
    }
    return num;
};

不喜勿喷,权当自己记录