LeetCode #12 Medium
题目描述
七个不同的符号代表罗马数字,其对应的值如下:
| 符号 | 值 |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
罗马数字是通过从高到低添加十进制位值的转换来形成的。将十进制位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,并将余数转换为罗马数字。
- 如果该值以 4 或 9 开头,使用减法形式,表示从下一个符号中减去一个符号。例如,4 是 1(
I)小于 5(V):IV,9 是 1(I)小于 10(X):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(10 (X) 小于 50 (L))
9 = IX(1 (I) 小于 10 (X))
注意:49 不是 1 (I) 小于 50 (L),因为转换是基于十进制位的
示例 2:
输入: num = 58
输出: "LVIII"
解释:
50 = L
8 = VIII
示例 3:
输入: num = 1994
输出: "MCMXCIV"
解释:
1000 = M
900 = CM
90 = XC
4 = IV
约束条件
1 <= num <= 3999
我的解题过程
解法:硬编码数字(推荐)
由于题目限制范围在 1 到 3999 之间,我们可以直接列出所有可能的罗马数字符号组合。将数字按照千位、百位、十位、个位分别处理,每一位都有固定的罗马数字表示方式。
function intToRoman(num: number): string {
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"];
return thousands[(num / 1000) | 0] + hundreds[((num % 1000) / 100) | 0] + tens[((num % 100) / 10) | 0] + ones[num % 10];
}
解题思路
算法步骤:
- 预定义千位、百位、十位、个位所有可能的罗马数字表示
- 将输入数字拆分为千位、百位、十位、个位
- 根据每一位的数字从对应的数组中取出罗马数字表示
- 将四个部分拼接成完整的罗马数字