今天撸的第二道题,动脑的感觉不错,照例写了一大坨,看来要好好看看算法了
思路就是取两个字符,看是否在字典中,如果有,就累计,并且跳过两个走下一轮,如果没有就查单个字符的字典累计,不过虽然麻烦,但是跑起来用时比下面写的经典的低100多毫秒,(用了slice,后面才想起来还有substr。。。)
var romanToInt = function(s) {
let nums = [1000, 500, 100, 50, 10, 5, 1]
let romans = ["M", "D", "C", "L", "X", "V", "I"];
let expectNum = [900,400,90,40,9,4];
let expectRomans =["CM","CD","XC","XL","IX","IV"];
let index =0;
let num = 0;
let roman = '';
let roman2 = '';
let length = s.length;
for(index; index < length;index++){
if(index +2 <= length){
roman2 = s.slice(index,index+2)
let douIndex = expectRomans.findIndex(item => item === roman2)
if(douIndex != -1){
num+=expectNum[douIndex];
index++;
continue;
}
}
roman = s[index];
let arrayIndex = romans.findIndex(item => item === roman)
if(arrayIndex != -1){
num+=nums[arrayIndex];
}
}
return num;
};
看到有写的简洁的就是这样,这个确实是发现了罗马数字的规律,感觉之前见过类似的题目,写的简单就是美啊,看起来顺眼
var romanToInt = function(s) {
let myMap = {
"I":1,
"IV":3,
"IX": 8,
"V":5,
"X":10,
"XL":30,
"XC":80,
"L":50,
"C": 100,
"CD": 300,
"CM": 800,
"D":500,
"M": 1000
}
let r = myMap[s.substr(0, 1)];
let len = s.length
for(let index=1;index<len;index++){
let two = s.substr(index-1,2);
let one = s.substr(index,1);
r += myMap[two] ? myMap[two]:myMap[one]
}
return r;
}