原题指路
解题思路
根据罗马数字的规定,从左到右每次都要选择尽可能大的罗马数字符号,所以……这简直是天然就满足贪心选择性质和最优子结构性质。因此,我们可以先建立一个罗马数字与整数相互转换的列表(从大到小进行排列的一张哈希表),然后通过遍历这个列表,每次向答案中加入当前整数所能包含的最大的罗马数字符号。
时间复杂度:
O
(
1
)
O(1)
O(1)
空间复杂度:
O
(
1
)
O(1)
O(1)
代码
class Solution:
'''
用于将整数转化为罗马数字的模块
'''
# 保存整数与罗马数字的对应关系
int_to_roman = [
(1000, "M"), (900, "CM"), (500, "D"),
(400, "CD"), (100, "C"), (90, "XC"),
(50, "L"), (40, "XL"), (10, "X"),
(9, "IX"), (5, "V"), (4, "IV"), (1, "I")
]
def intToRoman(self, num: int) -> str:
'''
用于转换的函数
Args:
num: 所需转换的整数
Returns:
返回一个与所输入整数相应的罗马数字字符串
'''
romannum = []
#采用贪心策略:通过循环遍历每次将整数中能包含的最大的罗马数字符号加入答案中
for integer, roman in self.int_to_roman:
if not num:
break
count, num = divmod(num, integer)
romannum.append(roman * count)
return "".join(romannum)