leetcode-12-Integer to Roman

来源:互联网 发布:C语言编程输出声音 编辑:程序博客网 时间:2024/06/06 05:08

1.说明:

    该题目要求是将一个整数转换为一个罗马数字,所以首先要搞清楚罗马数字的规则。

2.罗马数字的规则:

    罗马数字和阿拉伯数字一样,都是十进制的,所以我们只要把每一位的数字拼凑到一起就可以了。但是有一点需要注意的是,罗马数字不同于阿拉伯数字,它的每一位数字表示方法不同,比如,对于阿拉伯数字,五用 ‘5’来表示,而五十只需要把 '5'放在十位就行了:‘50’,因为有0占位,因此不会有任何歧义。但是罗马数字没有占位机制,因此各个位的表示方法不同,如五用罗马数字表示为 ‘V’,五十则为 ‘X’。

    虽然罗马数字每一个位对应的数字符号不同,但是表示的方法都是一样的,都是通过表示‘1’的符号和表示‘5’的符号组合而成。表示方法如下:假设某一位表示‘1’的符号为A,表示‘5’的符号为B,则 0,1,2,3,4,5,6,7,8,9分别为     ‘’(空字符),A, AA, AAA, AB(可以这么理解,A位于B左侧相当于B-A,A位于B右侧相当于B+A), B, BA, BAA, BAAA, AC(C是更高一位的‘1’,相当于10 - 1)。

    根据上面的叙述,我们只需要知道每一位表示 ‘1’和 ‘5’的符号,就可以按照上述规则拼凑起罗马数字了。

    值得注意的是,题目中说明输入整数从1 ~ 3999 ,因此只需要知道个位到千位的表示符号即可。

3.代码:

/** * @param {number} num * @return {string} */var intToRoman = function(num) {    var result = '';    var temp;    var list = [        {            one: 'I',            five: 'V'        },        {            one: 'X',            five: 'L'        },        {            one: 'C',            five: 'D'        },        {            one: 'M'        }    ];    var map = function (integer, cur, next) {        var one = cur.one;        var five = cur.five;        var ten = next && next.one;        switch (integer) {            case 0:                return '';            case 1:                return one;            case 2:                return one + one;            case 3:                return one + one + one;            case 4:                return one + five;            case 5:                 return five;            case 6:                return five + one;            case 7:                return five + one + one;            case 8:                return five + one + one + one;            case 9:                return one + ten;        }    };    while (num) {        temp = num % 10;        result = map(temp, list[0], list[1]) + result;        list.shift();        num = Math.floor(num / 10);    }    return result;};


原创粉丝点击