本文我们来讲解LeetCode 第12题:整数转罗马数字 —— 详解与实现。
引言
今天咱们要讨论的是LeetCode上的第12题——整数转罗马数字。这个题目看似简单,但实际上却充满了历史和文化的韵味。我们不仅要掌握算法,还能从中感受到古罗马人的智慧。接下来,我将带你一起揭开这个问题的神秘面纱。
题目描述
题目要求将一个给定的整数转换成罗马数字。罗马数字由七种符号组成:I
,V
,X
,L
,C
,D
和 M
。这些符号分别代表1,5,10,50,100,500 和 1000。罗马数字的规则如下:
- 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3。
- 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8。
- 小的数字(限于I、X和C)在大的数字的左边,所表示的数等于大数减小数得到的数,例如:IV = 4。
思路解析
罗马数字转化为整数的过程主要是根据罗马数字的规则进行分组和匹配。具体的步骤如下:
步骤详解
- 定义符号和值的对应关系:
我们需要一个数组来保存罗马数字的符号以及它们对应的整数值。 - 从大到小匹配:
我们从最大的符号开始匹配,尽量匹配大的符号,如果当前符号能够匹配上,就将对应的值累加到结果中,并减少相应的整数值。 - 特殊规则:
在匹配过程中,需要考虑罗马数字的特殊规则,即4、9、40、90、400、900等情况,这些需要用两个符号来表示的特殊情况。
动图演示
代码实现
讲了这么多,咱们用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[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
StringBuilder roman = new StringBuilder();
for (int i = 0; i < values.length; i++) {
while (num >= values[i]) {
num -= values[i];
roman.append(symbols[i]);
}
}
return roman.toString();
}
}
代码详解
我们逐行来看一下代码的实现逻辑:
-
定义罗马数字和对应整数的映射:
int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
values
数组保存罗马数字对应的整数值,从大到小排列。symbols
数组保存罗马数字符号,与values
一一对应。
-
匹配和累加:
StringBuilder roman = new StringBuilder(); for (int i = 0; i < values.length; i++) { while (num >= values[i]) { num -= values[i]; roman.append(symbols[i]); } }
- 使用
StringBuilder
来构建最终的罗马数字字符串。 - 遍历
values
数组,从大到小匹配符号。 - 如果当前整数值
num
大于等于当前values[i]
,则减去values[i]
,并将对应的symbols[i]
添加到roman
中。
- 使用
举例说明
咱们用几个例子来看看这个算法是怎么工作的:
-
示例1:
- 输入:
1994
- 过程:
- 初始:
num = 1994
- 匹配
M
,num
变为1994 - 1000 = 994
,roman
变为M
- 匹配
CM
,num
变为994 - 900 = 94
,roman
变为MCM
- 匹配
XC
,num
变为94 - 90 = 4
,roman
变为MCMXC
- 匹配
IV
,num
变为4 - 4 = 0
,roman
变为MCMXCIV
- 最终得到罗马数字为
MCMXCIV
。
- 初始:
- 输入:
-
示例2:
- 输入:
58
- 过程:
- 初始:
num = 58
- 匹配
L
,num
变为58 - 50 = 8
,roman
变为L
- 匹配
V
,num
变为8 - 5 = 3
,roman
变为LV
- 匹配
I
,num
变为3 - 1 = 2
,roman
变为LVI
- 匹配
I
,num
变为2 - 1 = 1
,roman
变为LVII
- 匹配
I
,num
变为1 - 1 = 0
,roman
变为LVIII
- 最终得到罗马数字为
LVIII
。
- 初始:
- 输入:
-
示例3:
- 输入:
3999
- 过程:
- 初始:
num = 3999
- 匹配
M
,num
变为3999 - 1000 = 2999
,roman
变为M
- 匹配
M
,num
变为2999 - 1000 = 1999
,roman
变为MM
- 匹配
M
,num
变为1999 - 1000 = 999
,roman
变为MMM
- 匹配
CM
,num
变为999 - 900 = 99
,roman
变为MMMCM
- 匹配
XC
,num
变为99 - 90 = 9
,roman
变为MMMCMXC
- 匹配
IX
,num
变为9 - 9 = 0
,roman
变为MMMCMXCIX
- 最终得到罗马数字为
MMMCMXCIX
。
- 初始:
- 输入:
总结
通过这个题目,我们了解了如何将整数转换为罗马数字。这个过程中,我们运用了贪心算法的思想,从最大值开始匹配,尽量匹配大的符号,这样可以减少计算步骤,提高效率。希望这篇博客能够帮助大家更好地理解和掌握这个题目。下次遇到类似的问题时,别忘了用这种贪心策略来试试看哦!
如果本文对您有所帮助的话,请收藏文章、关注作者、订阅专栏,感激不尽。