刚开始看到这道题的时候,我的思路历程大概如下:
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;
};
不喜勿喷,权当自己记录