From 14008b19961c407e2274425028d881d1d54b61d0 Mon Sep 17 00:00:00 2001 From: = <--gbloal> Date: Sat, 1 Jun 2024 15:23:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=95=B4=E6=95=B0=E8=BD=AC=E7=BD=97?= =?UTF-8?q?=E9=A9=AC=E6=95=B0=E5=AD=97(12)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- leetcode/中等/整数转罗马数字.js | 114 ++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 leetcode/中等/整数转罗马数字.js diff --git a/leetcode/中等/整数转罗马数字.js b/leetcode/中等/整数转罗马数字.js new file mode 100644 index 0000000..5046ea0 --- /dev/null +++ b/leetcode/中等/整数转罗马数字.js @@ -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,遇到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));