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