leetcode #12 Integer to Roman

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左边

知道了规则,再来处理这个问题。其实难点在于数字可以放在左边也可以放在右边。 如果都只能放在右边,就可以直接处理加法了。好在可以放在左边情况应该只有6种,所以我们只需要预先定义好这六种情况:

罗马数字 I V X L C D M IV IX XL XC CD CM
整数 1 5 10 50 100 500 1000 4 9 40 90 400 900

接下来 我们只需要每次选最大的数字组合起来,将剩下的值重复这个步骤。

/**
 * @param {number} num
 * @return {string}
 */
var intToRoman = function (num) {
    let romanNum='';
    const romanNums = [
        { roman: 'I', num: 1 },
        { roman: 'V', num: 5 },
        { roman: 'X', num: 10 },
        { roman: 'L', num: 50 },
        { roman: 'C', num: 100 },
        { roman: 'D', num: 500 },
        { roman: 'M', num: 1000 },
        { roman: 'IV', num: 4 },
        { roman: 'IX', num: 9 },
        { roman: 'XL', num: 40 },
        { roman: 'XC', num: 90 },
        { roman: 'CD', num: 400 },
        { roman: 'CM', num: 900 }
    ];
    romanNums.sort((a, b) => b.num - a.num);  //按照从大到小排序
    while (num>0){
        let roman;
        for (roman of romanNums){  //找到剩余数字可以匹配的最大罗马数字
            if (roman.num<=num){
                break;
            }
        }
        num-=roman.num;
        romanNum+=roman.roman;
    }
    return romanNum;
};

推荐阅读更多精彩内容