algorighm/leetcode/中等/整数转罗马数字.js
2024-06-01 15:23:58 +08:00

115 lines
3.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
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));