leetcode #13 Roman to Integer

Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.

  • 题目大意
    将一个罗马数字转化为整数

对于如何将整数转为罗马数字 请看这篇

国人可能对于罗马数字比较陌生,首先来熟悉一下罗马数字的规则:
罗马数字共有7个,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)。(维基百科)

罗马数字 I V X L C D M
整数 1 5 10 50 100 500 1000
  1. 一个罗马数字重复几次,就表示这个数的几倍。最多3次
  2. 右加左减:
    在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
    在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。V,L,D 不能放在大数的左边;左减时不可跨越一个位值。比如,99不可以用IC表示,而是用XCIX表示。
  3. 在罗马数字的上方加上一条横线或者加上下标,表示将这个数乘以1000。 (在该题目中用不到,因为只用考虑4000以内的数字)

对于左减时不可跨越一个位值,可能比较难理解,具体来说,就是
I只能放在V,X左边
X只能放在L,C左边
C只能放在D, M左边

知道了规则,再来处理这个问题就非常简单了。我们只需要按顺序遍历罗马数字,当遇到右边的数字比左边的小,就用加法;否则用减法;

/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function (s) {
    const ronmanNums = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000,
    };
    return s.split('')
        .reduce((prev, d, i, arr) => {
            const currentNum = ronmanNums[d];
            if ((i === arr.length - 1) || (currentNum >= ronmanNums[arr[i + 1]])) { //最后一位或者右边的数字比当前的小,使用加法
                return prev + currentNum;
            }
            else {
                return prev - currentNum;
            }
        }, 0);
};

推荐阅读更多精彩内容