LeetCode #12 Medium

整数转罗马数字

更新于:2026-01-30 在 LeetCode 上查看

题目描述

七个不同的符号代表罗马数字,其对应的值如下:

符号
I1
V5
X10
L50
C100
D500
M1000

罗马数字是通过从高到低添加十进制位值的转换来形成的。将十进制位值转换为罗马数字有以下规则:

  • 如果该值不是以 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 的幂(IXCM)可以连续附加最多 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];
}

解题思路

算法步骤:

  1. 预定义千位、百位、十位、个位所有可能的罗马数字表示
  2. 将输入数字拆分为千位、百位、十位、个位
  3. 根据每一位的数字从对应的数组中取出罗马数字表示
  4. 将四个部分拼接成完整的罗马数字