整数转罗马数字
七个不同的符号代表罗马数字,其值如下:
| 符号 | 值 |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
如果该值不是以 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++
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
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 resGo
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
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)。