LeetCode0012. 整数转罗马数字

一. 题目
  1. 题目
    在这里插入图片描述
  2. 示例
    在这里插入图片描述
二. 方法一
  1. 解题思路
    这个方法应该只要看代码就能理解, 不过缺点是代码太长了, 容易出错

  2. 解题代码

    def intToRoman(self, num: int) -> str:
        str1 = ""
        # 因为num < 4000, 所以千位时不需要考虑 大于等于4的情况
        if num >= 1000:
            n1 = num // 1000
            # 千位是几就添加几个"M"
            str1 += "M" * n1
            num -= 1000 * n1
        if num >= 100:
            n2 = num // 100
            # 如果百位是9, 就添加"CM"
            if n2 == 9:
                str1 += "CM"
            # 如果百位是4, 就添加"CD"
            if n2 == 4:
                str1 += "CD"
            # 如果百位在[5, 9)
            if 5 <= n2 < 9:
                str1 += "D"
                str1 += "C" * (n2 - 5)
            # 如果百位在[0, 4)
            if 0 <= n2 < 4:
                str1 += "C" * n2
            num -= 100 * n2
        if num >= 10:
            n3 = num // 10
            if n3 == 9:
                str1 += "XC"
            if n3 == 4:
                str1 += "XL"
            if 5 <= n3 < 9:
                str1 += "L"
                str1 += "X" * (n3 - 5)
            if 0 <= n3 < 4:
                str1 += "X" * n3
            num -= 10 * n3
        if num == 9:
            str1 += "IX"
        if num == 4:
            str1 += "IV"
        if 5 <= num < 9:
            str1 += "V"
            str1 += "I" * (num - 5)
        if 0 <= num < 4:
            str1 += "I" * num
    
        return str1
    
  3. 分析
    时间复杂度: O(1)
    空间复杂度: O(1)

三. 方法二: 硬编码数字
  1. 解题思路
    列表中存放每一位上可能的罗马数字表示情况
    然后进行匹配即可

  2. 解题代码

    def intToRoman(num: int) -> str:
        thousands = ["", "M", "MM", "MMM"]
        hundreds = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"]
        tens = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"]
        ones = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]
        n1 = num // 1000
        n2 = num % 1000 // 100
        n3 = num % 100 // 10
        n4 = num % 10
        return thousands[n1] + hundreds[n2] + tens[n3] + ones[n4]
    
  3. 分析
    时间复杂度: O(1)
    空间复杂度: O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值