题目描述
给定一个整数,将其转换为罗马数字。输入确保在 1 到 3999 的范围内。
实现思路
创建一个映射表存储罗马数字的字符与对应的数值。从大到小遍历映射表中的数值,每次尝试将当前数值减去输入的整数,并将对应的罗马字符添加到结果字符串中,直到输入的整数小于当前数值为止。重复此过程直到输入的整数变为0。
算法实现
C
#include <stdio.h>
#include <string.h>
char *intToRoman(int num) {
int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
char *romans[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
char *res = malloc(16);
memset(res, '0', 15); // Allocate and initialize to avoid undefined behavior.
res[15] = '\0'; // Null terminate the string.
int i = 0, index = 0;
while (num > 0) {
for (; num >= values[i]; i++) {
strcat(res, romans[i]);
num -= values[i];
}
i++;
}
return res;
}
Python
def int_to_roman(num):
val = [
1000, 900, 500, 400,
100, 90, 50, 40,
10, 9, 5, 4,
1
]
syms = [
"M", "CM", "D", "CD",
"C", "XC", "L", "XL",
"X", "IX", "V", "IV",
"I"
]
roman_num = ''
i = 0
while num > 0:
for _ in range(num // val[i]):
roman_num += syms[i]
num -= val[i]
i += 1
return roman_num
Java
public class Solution {
public String intToRoman(int num) {
int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String romans[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
StringBuilder res = new StringBuilder();
for (int i = 0; num > 0; i++) {
while (num >= values[i]) {
res.append(romans[i]);
num -= values[i];
}
}
return res.toString();
}
}
时间复杂度
O(1) - 因为输入范围固定且有限,循环次数不会超过固定的次数。