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

解法二:映射

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

解法三:

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

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

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

最后更新于