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