12. 整数转罗马数字

题目

罗马数字包含以下七种字符: I , V , X , L , C , D 和 M I, V, X, L,C,D 和 M IVXLCDM
例如, 罗马数字 2 2 2 写做 I I II II ,即为两个并列的 1 1 1 12 12 12 写做 X I I XII XII ,即为 X + I I X + II X+II 。 $27 $写做 X X V I I XXVII XXVII, 即为 X X + V + I I XX + V + II XX+V+II
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 4 4 不写做 I I I I IIII IIII,而是 I V IV IV。数字 1 1 1 在数字 5 5 5 的左边,所表示的数等于大数 5 5 5 减小数 1 1 1 得到的数值 4 4 4 。同样地,数字 9 9 9 表示为 I X IX IX。这个特殊的规则只适用于以下六种情况:
I I I 可以放在 V ( 5 ) V (5) V(5) X ( 10 ) X (10) X(10) 的左边,来表示 4 4 4 9 9 9
X X X 可以放在 L ( 50 ) L (50) L(50) C ( 100 ) C (100) C(100) 的左边,来表示 40 40 40 90 90 90
C C C 可以放在 D ( 500 ) D (500) D(500) M ( 1000 ) M (1000) M(1000) 的左边,来表示 400 400 400 900 900 900
给你一个整数,将其转为罗马数字。

例子

  1. 输入: n u m = 58 num = 58 num=58
    输出: “ L V I I I " “LVIII" LVIII"
    解释: L = 50 , V = 5 , I I I = 3. L = 50, V = 5, III = 3. L=50,V=5,III=3.
  2. 输入: n u m = 1994 num = 1994 num=1994
    输出: " M C M X C I V " "MCMXCIV" "MCMXCIV"
    解释: M = 1000 , C M = 900 , X C = 90 , I V = 4. M = 1000, CM = 900, XC = 90, IV = 4. M=1000,CM=900,XC=90,IV=4.

思路

1. 愚蠢的暴力解法

思路大概就是除以10,挨个将每个位上的数字表示出来。比如 1984 1984 1984分为 1000 1000 1000 900 900 900 80 80 80 4 4 4

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
class Solution:
    def intToRoman(self, num: int) -> str:
        dict = {'IV': 4, 'V': 5, 'IX': 9, 'XL': 40, 'L': 50, 'XC': 90, 'CD': 400, 'D': 500, 'CM': 900, 'M': 1000}
        nums = str(num)
        l = []

        for i in range(len(nums)):
            a = (num % 10) * 10**i
            if a in [1, 2, 3]:
            # Python 会将 a 转换为整型,然后再进行整数除法运算。
                l.append('I' * a)
            elif a in [6, 7, 8]:
                b = a - 5
                l.append('V' + 'I' * b)
            elif a in [10, 20, 30]:
                l.append('X' * (a // 10))
            elif a in [60, 70, 80]:
                b = a - 50
                l.append('L' + 'X' * (b // 10))
            elif a in [100, 200, 300]:
                l.append('C' * (a // 100))
            elif a in [600, 700, 800]:
                b = a - 500
                l.append('D' + 'C' * (b // 100))
            elif a in [1000, 2000, 3000]:
                l.append('M' * (a // 1000))
            else:
            # 这里的 d.items() 方法返回一个可迭代的键值对对象,对于每个键值对 (k, v),如果值 v 等于目标值 target,则返回对应的键 k。
                for k, v in dict.items():
                    if v == a:
                        l.append(k)
                        break
            num = num // 10

        output = ''
        while l:
            output += l.pop()

        return output

2. 聪明的暴力解法

这个思路相对比较简单,因为题目中说输入在 1   3999 1 ~3999 1 3999 的范围内,所以我们把 1 到 9 , 10 到 90 , 100 到 900 , 1000 到 3000 1 到 9,10 到 90,100 到 900,1000 到 3000 19109010090010003000 对应的罗马数字都表示出来,最后对于任何输入,我们要做的就是把找到的罗马数字组合起来即可。

比如输入是 2359 2359 2359,我们找到 2000 , 300 , 50 , 9 2000,300,50,9 2000300509 对应的罗马数字为 M M , C C C , L , I X , MM,CCC,L,IX, MMCCCLIX组合后得到结果为 M M C C C L I X 。 MMCCCLIX。 MMCCCLIX

  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 空间复杂度: O ( 1 ) O(1) O(1)
class Solution:
    def intToRoman(self, num: int) -> str:
        M = ["", "M", "MM", "MMM"] # 1000,2000,3000
        C = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"] # 100~900
        X = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"] # 10~90
        I = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"] # 1~9
        return M[num//1000] + C[(num%1000)//100] + X[(num%100)//10] + I[num%10]

3. 贪心算法

在以前还使用现金购物的时候,找零钱的时候一般商家会尽量选择面值大的纸币(硬币)给顾客,这样才会使得给顾客的纸币(硬币)张数最少,让顾客点钱的时候更方便。
贪心法则:尽量使用最大的数来表示,以使表达的数字个数最少。比如对于 1994 这个数,如果我们每次尽量用最大的数来表示,依次选 1000 , 900 , 90 , 4 1000,900,90,4 1000900904 会得到正确结果 M C M X C I V 。 MCMXCIV。 MCMXCIV
所以,我们将哈希表按照从大到小的顺序排列,然后遍历哈希表,直到表示完整个输入。

  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 空间复杂度: O ( 1 ) O(1) O(1)
class Solution:
    def intToRoman(self, num: int) -> str:
        dict = {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'}
        s = ''
        # 遍历字典的键值
        for key in dict:
            if num // key != 0:
                a = num // key
                s += a * dict[key]
                num %= key
        return s

你可能感兴趣的:(LeetCode题解,python,算法,数据结构)