Skip to content

整数转罗马数字 ​

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

符号值
I1
V5
X10
L50
C100
D500
M1000

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

如果该值不是以 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

提示: 1 <= num <= 3999

解题思路:

将每个数位对应的罗马字符串预存为二维表,table[位数][数字],位数 0=个位,1=十位,2=百位,3=千位,按位提取数字直接查表拼接。

C++

cpp
class Solution {
public:
    string intToRoman(int num) {
        const string table[4][10] = {
            {"","I","II","III","IV","V","VI","VII","VIII","IX"},
            {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
            {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
            {"","M","MM","MMM","","","","","",""},
        };
        string s = to_string(num);
        int n = s.size();
        string res;
        for (int i = 0; i < n; i++) {
            int position = n - 1 - i;
            int digit = s[i] - '0';
            res += table[position][digit];
        }
        return res;
    }
};

Python

python
def intToRoman(num: int) -> str:
    table: list[list[str]] = [
        ["","I","II","III","IV","V","VI","VII","VIII","IX"],
        ["","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"],
        ["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"],
        ["","M","MM","MMM"],
    ]
    s: str = str(num)
    n: int = len(s)
    res: str = ""
    for i in range(n):
        position: int = n - 1 - i
        digit: int = int(s[i])
        res += table[position][digit]
    return res

Go

go
func intToRoman(num int) string {
    var table [][]string = [][]string{
        {"","I","II","III","IV","V","VI","VII","VIII","IX"},
        {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
        {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
        {"","M","MM","MMM"},
    }
    s := strconv.Itoa(num)
    n := len(s)
    res := ""
    for i := 0; i < n; i++ {
        position := n - 1 - i
        digit := int(s[i] - '0')
        res += table[position][digit]
    }
    return res
}

Java

java
class Solution {
    public String intToRoman(int num) {
        String[][] table = {
            {"","I","II","III","IV","V","VI","VII","VIII","IX"},
            {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
            {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
            {"","M","MM","MMM"},
        };
        String s = String.valueOf(num);
        int n = s.length();
        String res = "";
        for (int i = 0; i < n; i++) {
            int position = n - 1 - i;
            int digit = s.charAt(i) - '0';
            res += table[position][digit];
        }
        return res;
    }
}

时间 O(1)(数字范围固定),空间 O(1)。

基于 VitePress 搭建

🌟训练营🤖AI面试📄做简历💻刷题