题目
一、题目分析
- 【七种字符】I, V, X, L,C,D 和 M。
- 【特殊的规则】
- I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
- X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
- C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
二、开始解题
2-1、正则过滤先去除6种特殊字符,再逐一统计和。
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function(s) {
if (!s) return 0;
const ROMAN_MUNBER_DICT = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
}
const SPECIAL_DICT = {
'IV': 4,
'IX': 9,
'XL': 40,
'XC': 90,
'CD': 400,
'CM': 900
}
let count = 0;
let specialArr = s.match(/(IV|IX|XL|XC|CD|CM)/g);
if (specialArr && specialArr.length > 0) {
let sLen = 0;
while (sLen < specialArr.length) {
count += SPECIAL_DICT[specialArr[sLen]]
sLen++;
}
}
s = s.replace(/(IV|IX|XL|XC|CD|CM)/g, s=>'');
let len = 0;
while (len < s.length) {
count += ROMAN_MUNBER_DICT[s[len]];
len++;
}
return count;
};
能跑~~但遍历了两次,太浪费了~~
2-2、优化一下代码,一次遍历解决
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function(s) {
if (!s) return 0;
const ROMAN_MUNBER_DICT = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
'IV': 4,
'IX': 9,
'XL': 40,
'XC': 90,
'CD': 400,
'CM': 900
}
let count = 0;
// let specialArr = s.match(/(IV|IX|XL|XC|CD|CM)/g);
// if (specialArr && specialArr.length > 0) {
// let sLen = 0;
// while (sLen < specialArr.length) {
// count += SPECIAL_DICT[specialArr[sLen]]
// sLen++;
// }
// }
// s = s.replace(/(IV|IX|XL|XC|CD|CM)/g, s=>'');
let len = 0;
while (len < s.length) {
if (s[len+1] && ROMAN_MUNBER_DICT[s[len]+s[len+1]]) {
count += ROMAN_MUNBER_DICT[s[len]+s[len+1]]
len+=2;
} else {
count += ROMAN_MUNBER_DICT[s[len]];
len++;
}
}
return count;
};
还行,再想想怎么优化~~
三、最后
未完待续~~