12. 整数转罗马数字「力扣」
题目描述
七个不同的符号代表罗马数字,其值如下:
符号 | 值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5
(V)
减 1(I)
:IV
,9 是 10(X)
减 1(I)
:IX。仅使用以下减法形式:4(IV)
,9(IX)
,40(XL)
,90(XC)
,400(CD)
和 900(CM)
。 - 只有 10 的次方(
I
,X
,C
,M
)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V
),50 (L
) 或 500 (D
)。如果需要将符号附加4次,请使用 减法形式。 给定一个整数,将其转换为罗马数字。
示例 1:
输入:num = 3749
输出:"MMMDCCXLIX"
解释:
3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC 由于 500 (D) + 100 (C) + 100 (C)
40 = XL 由于 50 (L) 减 10 (X)
9 = IX 由于 10 (X) 减 1 (I)
注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位。
示例 2:
输入:num = 58
输出:"LVIII"
解释:
50 = L
8 = VIII
示例 3:
输入:num = 1994
输出:"MCMXCIV"
解释:
1000 = M
900 = CM
90 = XC
4 = IV
解题
分析👇
源码如下:
/**
* @param {number} num
* @return {string}
*/
var intToRoman = function(num) {
const conf = {
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',
}
const strNum = String(num)
const nArr = Object.keys(conf).sort((a, b) => b - a)
let roman = ''
for(let i = 0, len = strNum.length; i < len; i++) {
// 由左到右依次获取,如:567,依次为:500, 60, 7
let current = +strNum[i] * Math.pow(10 , len - i - 1)
while(current > 0) {
// 获取当前位数匹配罗马数字对应的数字
const key = nArr.find(n => current >= n)
// 拼接罗马数字
roman += conf[key]
// 减去匹配到罗马数字对应的数字, 重置current的值,
current -= key
}
}
return roman
};```