【力扣】13. 罗马数字转整数

281 阅读1分钟

题目

image.png

image.png

image.png

一、题目分析

  • 【七种字符】I, V, X, L,C,D 和 M。
  • 【特殊的规则】
    1. I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
    2. X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
    3. 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;
};

image.png

能跑~~但遍历了两次,太浪费了~~

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;
};

image.png

还行,再想想怎么优化~~

三、最后

题目地址

未完待续~~