整数转罗马数字(LeetCode12)
题目描述
在这道题中,我们需要将一个给定的整数转换为罗马数字。罗马数字是通过添加从最高到最低的小数位值的转换而形成的,每个小数位值都有相应的罗马数字表示。
给定一个整数,将其转换为罗马数字。
思路1:逐位转换
思路
- 创建一个数值与罗马数字的映射表
valueSymbols
,按照从大到小的顺序排列。 - 遍历
valueSymbols
,每次取出当前的数值和对应的罗马数字。 - 如果当前的数值大于等于
value
,则将num
减去value
,并将罗马数字添加到结果数组中。 - 如果
num
为 0,表示已经完成转换,退出循环。 - 最终将结果数组连接成字符串返回。
代码实现
/**
* @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:硬编码转换
思路
- 将每个数字在个位、十位、百位、千位上的罗马数字表示硬编码。
- 根据整数的千位、百位、十位、个位分别获取其罗马数字表示。
- 将获取到的罗马数字表示连接成字符串返回。
代码实现
/**
* @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('');
};
总结
本文介绍了两种解决整数转罗马数字问题的方法:逐位转换和硬编码转换。逐位转换方法使用了数值与罗马数字的映射表,通过遍历映射表,依次将整数转换为罗马数字。硬编码转换方法直接在代码中硬编码了每个数字在不同位上的罗马数字表示,通过整数的千位、百位、十位、个位获取其对应的罗马数字。两种方法各有优劣,逐位转换方法适用于罗马数字的规律性转换,而硬编码转换方法则更为直观和简洁。
评论区