美文网首页
leetcode #12 Integer to Roman

leetcode #12 Integer to Roman

作者: huntriver | 来源:发表于2017-09-15 13:10 被阅读0次

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

    相关文章

      网友评论

          本文标题:leetcode #12 Integer to Roman

          本文链接:https://www.haomeiwen.com/subject/hlessxtx.html