leetcode算法热题 - 12. 整数转罗马数字

121 阅读1分钟

问题描述

给定一个范围为 1 到 3999 的整数,将其转换为对应的罗马数字。例如,输入整数 3 应该返回 "III",输入整数 4 应该返回 "IV",输入整数 58 应该返回 "LVIII"。

解法思路

要解决这个问题,我们可以使用贪心算法。首先,我们需要定义一个包含所有可能罗马数字的数组,并且按从大到小的顺序排列。接下来,我们通过不断地减去当前最大的罗马数字,直到剩余的整数为零为止。

代码实现

function intToRoman(num: number): string {
    const romanMap: [number, string][] = [
        [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']
    ];

    let result = '';
    for (let [value, roman] of romanMap) {
        while (num >= value) {
            result += roman;
            num -= value;
        }
    }

    return result;
}

const num = 58;
console.log(intToRoman(num)); // Output: "LVIII"

复杂度分析

该解法的时间复杂度为 O(1),因为我们只对有限数量的罗马数字进行了迭代操作。空间复杂度也是 O(1),因为我们使用了固定大小的数组和常量变量来存储数据。

总结: 通过贪心算法,我们可以轻松地将整数转换为罗马数字。这个问题可能看起来很复杂,但实际上它有一个相对简单且高效的解决方案。