• LeetCode 12. 整数转罗马数字


    12. 整数转罗马数字

    题目:整数转罗马数字
    链接 https://leetcode.cn/problems/integer-to-roman/
    废物本人,想了挺久也没啥好方法,只能靠复制粘贴度日

    官方思路

    1. 模拟
      根据罗马数字的唯一表示法,为了表示一个给定的整数 num,我们寻找不超过num 的最大符号值,将 num 减去该符号值,然后继续寻找不超过 num 的最大符号值,将该符号拼接在上一个找到的符号之后,循环直至num 为 0。最后得到的字符串即为 num 的罗马数字表示。
      编程时,可以建立一个数值-符号对的列表 valueSymbols,按数值从大到小排列。遍历 valueSymbols 中的每个数值-符号对,若当前数值 value 不超过 num,则从num 中不断减去 value,直至num 小于value,然后遍历下一个数值-符号对。若遍历中num 为 0 则跳出循环。
    class Solution:
    
        VALUE_SYMBOLS = [
            (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:
            roman = list()
            for value, symbol in Solution.VALUE_SYMBOLS:
                while num >= value:
                    num -= value
                    roman.append(symbol)
                if num == 0:
                    break
            return "".join(roman)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    复杂度分析

    时间复杂度:O(1)。由于valueSymbols 长度是固定的,且这 13 字符中的每个字符的出现次数均不会超过 3,因此循环次数有一个确定的上限。对于本题给出的数据范围,循环次数不会超过 15 次。
    空间复杂度:O(1)。

    1. 硬编码数字
      详情看一下链接
      作者:LeetCode-Solution
      链接:https://leetcode.cn/problems/integer-to-roman/solution/zheng-shu-zhuan-luo-ma-shu-zi-by-leetcod-75rs/
    class Solution:
    
        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"]
    
        def intToRoman(self, num: int) -> str:
            return Solution.THOUSANDS[num // 1000] + \
                Solution.HUNDREDS[num % 1000 // 100] + \
                Solution.TENS[num % 100 // 10] + \
                Solution.ONES[num % 10]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    复杂度分析
    时间复杂度:O(1)。计算量与输入数字的大小无关。
    空间复杂度:O(1)。

    1. 贪心哈希表
    class Solution:
        def intToRoman(self, num: int) -> str:
            # 使用哈希表,按照从大到小顺序排列
            hashmap = {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'}
            res = ''
            for key in hashmap:
                if num // key != 0:
                    count = num // key  # 比如输入4000,count 为 4
                    res += hashmap[key] * count 
                    num %= key
            return res
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    作者:z1m
    链接:https://leetcode.cn/problems/integer-to-roman/solution/tan-xin-ha-xi-biao-tu-jie-by-ml-zimingmeng/

  • 相关阅读:
    LLM 大语言模型学习笔记
    大数据讲课笔记3.3 Hadoop集群配置
    Java真实面试(苏州安硕信息)
    【调度算法】NSGA III
    linux centos 挂载磁盘
    Linux线程控制
    威纶通软件安装(一步一步,包成功)
    #gStore-weekly | gAnswer源码解析 调用NE模块流程
    【智能优化算法】基于蝙蝠优化算法求解多目标优化问题附matlab代码
    MATLAB改变默认工作路径
  • 原文地址:https://blog.csdn.net/weixin_48127034/article/details/126198881