[leetcode刷题]力扣刷题4之整数转罗马数字(中等)

这题要比罗马数字转整数难,

题目

输入整数,输出罗马数字。

示例 :

输入:num = 3749    输出: "MMMDCCXLIX"

思路

贪心法则:我们每次尽量使用最大的数来表示。 比如对于 1994 这个数,如果我们每次尽量用最大的数来表示,依次选 1000,900,90,4,会得到正确结果 MCMXCIV。

所以,我们将哈希表按照从大到小的顺序排列,然后遍历哈希表,直到表示完整个输入。

[leetcode刷题]力扣刷题4之整数转罗马数字(中等)_第1张图片[leetcode刷题]力扣刷题4之整数转罗马数字(中等)_第2张图片

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/integer-to-roman/solutions/87905/tan-xin-ha-xi-biao-tu-jie-by-ml-zimingmeng/从这个链接能更直观的感受整个遍历过程

代码实现

class Solution:
    def intToRoman(self, num: int) -> str:
        val = [
            1000, 900, 500, 400,  # 千位和特殊情况:CM(900)和CD(400)
            100, 90, 50, 40,  # 百位和特殊情况:XC(90)和XL(40)
            10, 9, 5, 4,  # 十位和特殊情况:IX(9)和IV(4)
            1  # 个位
        ]
    
        # 对应的罗马数字符号,与上面的数值一一对应
        syb = [
            "M", "CM", "D", "CD",  # 千位和特殊符号
            "C", "XC", "L", "XL",  # 百位和特殊符号
            "X", "IX", "V", "IV",  # 十位和特殊符号
            "I"  # 个位
        ]
    
        # 用于存储最终的罗马数字字符串
        roman_num = ''
    
        # 初始化索引i,用于遍历val和syb列表
        i = 0
    
        # 使用while循环,当num大于0时持续执行
        while num > 0:
            # 计算当前罗马数字符号应该重复的次数
            for _ in range(num // val[i]):  # 例如,1987 // 1000 = 1,则M会添加一次
                roman_num += syb[i]  # 将对应的罗马数字符号添加到结果字符串中
                num -= val[i]  # 减去已转换的部分数值,例如1987 - 1000 = 987
    
            # 继续处理下一个罗马数字符号
            i += 1
    
        # 返回最终转换完成的罗马数字字符串
        return roman_num

你可能感兴趣的:(leetcode,算法,贪心算法,哈希表)