feat: 整数转罗马数字(12)

This commit is contained in:
= 2024-06-01 15:23:58 +08:00
parent 75c7ba15a2
commit 14008b1996

View File

@ -0,0 +1,114 @@
/*
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遇到4910900这几个我们当度使用
不要出现viiii表示9的情况这是不符合罗马数字表示规则的所以我们可以遍历我们创建好的数字
列表从大到小分别是1000900500400100905040109541遍历所有列表
使用当前的数值一直做减法操作如果做完减法之后比当前列表的数小了就与下一个列表中的数做减法操作
知道为零退出循环每一次得到的罗马数字拼接起来就是我们要计算的罗马数
*/
// /**
// * @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));