# 12. Integer to Roman

**<font color=red>难度: Medium</font>**

## 刷题内容

> 原题连接

* https://leetcode.com/problems/integer-to-roman/description/

> 内容描述

Roman numerals are represented by seven different symbols: `I`, `V`, `X`, `L`, `C`, `D` and `M`.
```
Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
```

For example, two is written as `II` in Roman numeral, just two one's added together. Twelve is written as, `XII`, which is simply `X` + `II`. The number twenty seven is written as `XXVII`, which is `XX` + `V` + `II`.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not `IIII`. Instead, the number four is written as `IV`. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as `IX`. There are six instances where subtraction is used:
 * `I` can be placed before `V` (5) and `X` (10) to make 4 and 9. 
 * `X` can be placed before `L` (50) and `C` (100) to make 40 and 90. 
 * `C` can be placed before `D` (500) and `M` (1000) to make 400 and 900.

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

##### Example 1:
```
Input: 3
Output: "III"
```

##### Example 2:
```
Input: 4
Output: "IV"
```

##### Example 3:
```
Input: 9
Output: "IX"
```

##### Example 4:
```
Input: 58
Output: "LVIII"
Explanation: L = 50, V = 5, III = 3.
```

##### Example 5:
```
Input: 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
```


## 解题方案

******- 时间复杂度: O(N)******- 空间复杂度: O(1)******


代码：

```javascript
let getMap = function () {
    return {
        1:'I',
        4:'IV',
        5:'V',
        9:'IX',
        10:'X',
        40:'XL',
        50:'L',
        90:'XC',
        100:'C',
        400:'CD',
        500:'D',
        900:'CM',
        1000:'M'
    };
};

let match = function (result,num) {
    let obj = getMap();
    while (result.num >= num){
        let n = parseInt(result.num /num);
        result.num = result.num % num;
        result.str = result.str + obj[num].repeat(n);
    }
};

/**
 * @param {number} num
 * @return {string}
 */
var intToRoman = function (num) {
    if(num < 1 || num > 3999) throw Error('error');
    let obj = getMap();
    if(num in obj) return obj[num];
    let result = {
        str:'',
        num
    };
    match(result,1000);
    match(result,900);
    match(result,500);
    match(result,400);
    match(result,100);
    match(result,90);
    match(result,50);
    match(result,40);
    match(result,10);
    match(result,9);
    match(result,5);
    match(result,4);
    match(result,1);

    return result.str;
};
```
