整数转罗马数字

原题指路

整数转罗马数字

解题思路

图片1.png
根据罗马数字的规定,从左到右每次都要选择尽可能大的罗马数字符号,所以……这简直是天然就满足贪心选择性质和最优子结构性质。因此,我们可以先建立一个罗马数字与整数相互转换的列表(从大到小进行排列的一张哈希表),然后通过遍历这个列表,每次向答案中加入当前整数所能包含的最大的罗马数字符号。

时间复杂度: 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值