目录
题目:
罗马数字包含以下七种字符:
I
,V
,X
,L
,C
,D
和M
。字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000例如, 罗马数字 2 写做
II
,即为两个并列的 1。12 写做XII
,即为X
+II
。 27 写做XXVII
, 即为XX
+V
+II
。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做
IIII
,而是IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在V
(5) 和X
(10) 的左边,来表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左边,来表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左边,来表示 400 和 900。给你一个整数,将其转为罗马数字。
示例 1:
输入: num = 3 输出: "III"示例 2:
输入: num = 4 输出: "IV"示例 3:
输入: num = 9 输出: "IX"示例 4:
输入: num = 58 输出: "LVIII" 解释: L = 50, V = 5, III = 3.示例 5:
输入: num = 1994 输出: "MCMXCIV" 解释: M = 1000, CM = 900, XC = 90, IV = 4.提示:
1 <= num <= 3999
1. 思路
罗马数字的转换可以通过贪心算法来实现。我们可以按照罗马数字的规则,从大到小依次匹配并减去对应的值,直到 num 变为 0。
2. 解题方法
- 初始化一个 StringBuilder 用于存储转换后的罗马数字。
- 枚举所有的罗马数字符号,按照从大到小的顺序进行匹配:
- 如果当前数字大于等于当前符号对应的值,则将对应的符号添加到 StringBuilder 中,并从 num 中减去对应的值。
- 重复步骤 2 直到 num 变为 0。
- 返回 StringBuilder 转换为的字符串。
3. 复杂度
- 时间复杂度:O(1),因为罗马数字的数量有限,不随输入变化而变化。
- 空间复杂度:O(1),只需要常数级别的额外空间。
4. Code
class Solution {
public String intToRoman(int num) {
// 用于存储转换后的罗马数字
StringBuilder roman = new StringBuilder();
// 枚举所有的罗马数字符号,按照从大到小的顺序进行匹配
while (num > 0) {
if (num >= 1000) {
roman.append("M");
num -= 1000;
} else if (num >= 900) {
roman.append("CM");
num -= 900;
} else if (num >= 500) {
roman.append("D");
num -= 500;
} else if (num >= 400) {
roman.append("CD");
num -= 400;
} else if (num >= 100) {
roman.append("C");
num -= 100;
} else if (num >= 90) {
roman.append("XC");
num -= 90;
} else if (num >= 50) {
roman.append("L");
num -= 50;
} else if (num >= 40) {
roman.append("XL");
num -= 40;
} else if (num >= 10) {
roman.append("X");
num -= 10;
} else if (num >= 9) {
roman.append("IX");
num -= 9;
} else if (num >= 5) {
roman.append("V");
num -= 5;
} else if (num >= 4) {
roman.append("IV");
num -= 4;
} else {
roman.append("I");
num -= 1;
}
}
// 返回转换后的罗马数字字符串
return roman.toString();
}
}
这段代码通过贪心算法实现了将整数转换为罗马数字的功能,按照题目中的规则逐步转换并减去对应的值。
欢迎大家后台联系讨论。
(一份Java面试宝典,有兴趣的读者姥爷可以私信我领取!!!免费滴)