feat: 整数转罗马数字(12)
This commit is contained in:
parent
75c7ba15a2
commit
14008b1996
114
leetcode/中等/整数转罗马数字.js
Normal file
114
leetcode/中等/整数转罗马数字.js
Normal 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,遇到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));
|
Loading…
x
Reference in New Issue
Block a user