115 lines
3.6 KiB
JavaScript
115 lines
3.6 KiB
JavaScript
/*
|
||
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
|
||
*/
|
||
|
||
/*
|
||
思路:这个题的重点是理解罗马数字的表示,假设我有一个数字1994要表示成罗马数字,我们尽可能
|
||
去挑大的表示所以可以拆分为1000 + 100 + 10 + 4,遇到4,9,10,900,这几个我们当度使用
|
||
不要出现viiii表示9的情况,这是不符合罗马数字表示规则的,所以我们可以遍历我们创建好的数字
|
||
列表,从大到小分别是1000,900,500,400,100,90,50,40,10,9,5,4,1,遍历所有列表
|
||
使用当前的数值一直做减法操作,如果做完减法之后比当前列表的数小了,就与下一个列表中的数做减法操作
|
||
知道为零,退出循环,每一次得到的罗马数字拼接起来就是我们要计算的罗马数。
|
||
*/
|
||
|
||
// /**
|
||
// * @param {number} num
|
||
// * @return {string}
|
||
// */
|
||
// const intToRoman = function (num) {
|
||
// const valueSymbols = [
|
||
// [1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'],
|
||
// [100, 'C'], [90, 'XC'], [50, 'L'], [40, 'XL'],
|
||
// [10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'], [1, 'I']];
|
||
// const roman = [];// 用于记录罗马数字标记
|
||
// for (const [value, symbol] of valueSymbols) {
|
||
// while (num >= value) {
|
||
// num -= value;
|
||
// roman.push(symbol);
|
||
// }
|
||
// if (num === 0) break;
|
||
// }
|
||
// return roman.join('');
|
||
// };
|
||
|
||
/*
|
||
思路2: 直接对所有数字在不同位上的表示做硬编码,比如1在个位上就是I,在10位上就是X,在百位上就是C
|
||
*/
|
||
/**
|
||
* @param {number} num
|
||
* @return {string}
|
||
*/
|
||
const intToRoman = function (num) {
|
||
const thousands = ['', 'M', 'MM', 'MMM'];
|
||
const hundreds = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'];
|
||
const tens = ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'];
|
||
const ones = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];
|
||
|
||
const roman = [];
|
||
roman.push(thousands[Math.floor(num / 1000)]);
|
||
roman.push(hundreds[Math.floor((num % 1000) / 100)]);
|
||
roman.push(tens[Math.floor((num % 100) / 10)]);
|
||
roman.push(ones[num % 10]);
|
||
return roman.join('');
|
||
};
|
||
|
||
console.log(intToRoman(123));
|