12. 整数转罗马数字

https://leetcode-cn.com/problems/integer-to-roman/

解法一:套规则

思路:特别蠢

罗马数字特点是“左减右加” (https://zhidao.baidu.com/question/13702383) 先将num的个十百千位取出来,然后从高到低逐位判断并输出即可。

class Solution:
    def intToRoman(self, num: int) -> str:
        res = ""
        #获取各位
        ones = num % 10
        tens = (num // 10) % 10
        hundreds = (num // 100) % 10
        thousands = (num // 1000) % 10

        for _ in range(thousands):  #处理千位
            res += "M"
        #处理百位
        if hundreds == 4:
            res += "CD"
        elif hundreds == 9:
            res += "CM"
        elif hundreds > 4 and hundreds < 9:
            res += "D"
            for _ in range(hundreds - 5):
                res += "C"
        elif hundreds > 0 and hundreds < 4:
            for _ in range(hundreds):
                res += "C"
        #处理十位
        if tens == 4:
            res += "XL"
        elif tens == 9:
            res += "XC"
        elif tens > 4 and tens < 9:
            res += "L"
            for _ in range(tens - 5):
                res += "X"
        elif tens > 0 and tens < 4:
            for _ in range(tens):
                res += "X"
        #处理个位
        if ones == 4:
            res += "IV"
        elif ones == 9:
            res += "IX"
        elif ones > 4 and ones < 9:
            res += "V"
            for _ in range(ones - 5):
                res += "I"
        elif ones > 0 and ones < 4:
            for _ in range(ones):
                res += "I"

        return res

解法二:映射

实际上跟解法一差不多,求出各数位的数字,然后映射到表里即可。

class Solution:
    def intToRoman(self, num: int) -> str:
        romans = [
            ['', 'M', 'MM', 'MMM'],    #千位
            ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'],    #百位
            ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],    #十位
            ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX']    #个位
        ]
        return romans[0][num // 1000] + romans[1][num%1000 // 100]\
               + romans[2][num%100 // 10] + romans[3][num%10]

解法三:

只考虑右加,不考虑左减,将10,9,5,4,1这些数从大到小都列入values,对应表示列入reps。

遍历values,遇到比num小的数就自减,并从左到右输出表示,直到num=0

class Solution:
    def intToRoman(self, num: int) -> str:
        values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
        reps = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']
        res = ''
        for i in range(len(values)):
            while num >= values[i]:
                num -= values[i]
                res += reps[i]
        return res

更简略的写法,数值和表示作为二元组写在一个表里:

class Solution:
    def intToRoman(self, num: int) -> str:
        res = ''
        token = [(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')]
        for value, rep in token:
            while num >= value:
                num -= value
                res += rep       
        return res

最后更新于