问题描述
罗马数字包含以下七种字符: 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 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10
示例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
思路分析
首先,我们将罗马数字的字符和对应的数值存储在两个数组中。roman_chars
数组存储了罗马数字的字符,roman_values
数组存储了对应的数值。例如,'I’对应的数值是1,'V’对应的数值是5,以此类推。
接下来,我们创建一个空字符串result
,用于存储转换后的罗马数字。
然后,我们使用贪心算法进行转换。贪心算法的思想是每次选择当前最优的解决方案,以达到全局最优的结果。
我们从最大的数值开始,也就是从1000开始遍历roman_values
数组,因为罗马数字的表示是按照从大到小的顺序排列的。
在每一次循环中,我们判断当前的数值是否小于等于给定的整数num
。
- 如果是,说明当前的罗马数字可以加入到结果字符串中。
- 首先将对应的罗马数字字符添加到
result
中。 - 然后将该数值从给定的整数
num
中减去,更新num
的值。 - 通过使用
while
循环,可以多次将同一个罗马数字字符添加到result
中,直到num
小于当前的数值。 - 这样能够保证我们使用尽可能多的最大的罗马数字字符来表示给定的整数。
如果当前的数值不满足条件,即大于给定的整数num
,则继续遍历下一个数值,并重复上述步骤。
最后,当遍历完所有的数值之后,我们得到了转换后的罗马数字。
最后返回最终的结果字符串result
。
通过这样的贪心算法思路,我们可以将给定的整数转换为相应的罗马数字。
代码分析
首先我们创建了一个Solution
类,并在该类中定义了intToRoman
方法来实现整数到罗马数字的转换。方法的参数是一个整数num
,表示需要转换的整数。
在方法中,我们定义了两个数组roman_chars
和roman_values
,分别用来存储罗马数字的字符和对应的数值。
接下来,我们创建了一个空字符串result
,用于存储转换后的罗马数字。
然后,我们使用贪心算法进行转换。
通过一个循环遍历roman_values
数组,我们可以依次检查每个罗马数字的数值是否满足要求。从最大的数值开始,我们首先检查是否当前的数值roman_values[i]
小于等于给定的整数num
。
如果是,说明当前的罗马数字可以加入到结果字符串中。
首先,我们将对应的罗马数字字符roman_chars[i]
添加到result
中。
然后,我们从给定的整数num
中减去该数值roman_values[i]
,更新num
的值。
此时,我们使用了一个while
循环,不断将同一个罗马数字字符添加到result
中,直到给定的整数num
小于当前的数值roman_values[i]
。
通过这样的方式,我们能够使用尽可能多的最大的罗马数字字符来表示给定的整数。
如果当前的数值roman_values[i]
不满足条件,即大于给定的整数num
,则继续遍历下一个数值,并重复上述步骤。
最终,当我们遍历完所有的数值之后,我们得到了转换后的罗马数字。
最后,我们返回最终的结果字符串result
。
通过这样的实现,我们可以将给定的整数转换为相应的罗马数字。
完整代码
class Solution(object): def intToRoman(self, num): """ :type num: int :rtype: str """ # 定义罗马数字字符和对应的阿拉伯数字值 roman_chars = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"] roman_values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1] # 初始化结果字符串 result = "" # 遍历罗马数字字符和对应的阿拉伯数字值 for i in range(len(roman_values)): # 当输入的数字大于等于当前罗马数字对应的阿拉伯数字值时 while num >= roman_values[i]: # 减去当前罗马数字对应的阿拉伯数字值 num -= roman_values[i] # 将当前罗马数字字符添加到结果字符串中 result += roman_chars[i] # 返回转换后的罗马数字字符串 return result
详细分析
class Solution(object): def intToRoman(self, num): """ :type num: int :rtype: str """
这段代码定义了一个名为Solution
的类,其中包含了一个名为intToRoman
的方法。intToRoman
方法接受一个整数num
作为参数,并返回一个字符串。
# 罗马数字字符表 roman_chars = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"] # 对应的数值表 roman_values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1] # 存储结果的字符串 result = ""
这段代码定义了两个数组roman_chars
和roman_values
,分别用于存储罗马数字的字符和对应的数值。result
是一个空字符串,用于存储转换后的罗马数字。
# 遍历数值表 for i in range(len(roman_values)): # 检查当前的数值是否小于等于给定的整数 while num >= roman_values[i]: # 如果满足条件,将对应的罗马数字字符添加到结果字符串中 result += roman_chars[i] # 从给定的整数中减去对应的数值 num -= roman_values[i]
这段代码使用循环来遍历roman_values
数组中的每个数值。在每次循环中,我们检查当前的数值roman_values[i]
是否小于等于给定的整数num
。如果满足条件,我们将对应的罗马数字字符roman_chars[i]
添加到结果字符串result
中,并从给定的整数num
中减去该数值。
# 返回转换后的罗马数字字符串 return result
最后,我们返回转换后的罗马数字字符串result
。
通过这个算法,我们可以将给定的整数转换为相应的罗马数字。
运行效果截图
调用示例
solution = Solution() num1 = 3 num2 = 4 num3 = 9 num4 = 58 num5 = 1994 print(solution.intToRoman(num1)) print(solution.intToRoman(num2)) print(solution.intToRoman(num3)) print(solution.intToRoman(num4)) print(solution.intToRoman(num5))
运行结果
完结