1. 程式人生 > >【leetcode】整數轉羅馬數字【Python】

【leetcode】整數轉羅馬數字【Python】

題目連結 在這裡插入圖片描述 遞迴演算法,需要注意40~50的情況特殊性

class Solution(object):
    def intToRoman(self, num):
        if num == 0: return ''
        if num == 4: return 'IV'
        if num == 9: return 'IX'
        if num == 40: return 'XL'
        if num == 90: return 'XC'
        if num == 400: return 'CD'
        if num == 900: return 'CM'
        if num >= 1 and num <= 3:
            return 'I' * num
        if num >= 5 and num <= 8:
            return 'V' + self.intToRoman(num - 5)
        if num >= 10 and num <= 39:
            m = (int)(num / 10)
            return 'X' * m + self.intToRoman(num - 10 * m)
        if num > 40 and num <= 49:
            return 'XL' +self.intToRoman(num - 40)
        if num >= 50 and num < 90:
            return 'L' + self.intToRoman(num - 50)
        if num >= 90 and num <= 99:
            return 'XC' + self.intToRoman(num - 90)
        if num >= 100 and num <= 399:
            m = (int)(num / 100)
            return 'C' * m + self.intToRoman(num - m * 100)
        if num > 400 and num <= 499:
            return 'CD' + self.intToRoman(num - 400)
        if num >= 500 and num < 900:
            return 'D' + self.intToRoman(num - 500)
        if num > 900 and num <= 999:
            return 'CM' +self.intToRoman(num - 900)
        if num >= 1000 and num <= 4000:
            m = (int)(num / 1000)
            return 'M' * m + self.intToRoman(num - m * 1000)
print(Solution().intToRoman(2000))

可以使用字典的方式,一步一步減去,採用字典的方式

class Solution(object):
    def intToRoman(self, num):
        """
        :type num: int
        :rtype: str
        """
        if num > 3999 or num < 1:
            return 0
        # 字典是無序的,所以不使用字典
        # 注意這裡一定要是倒序,否則執行會有問題,讓數從大往小查詢適合的羅馬數
        num_tuple = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
        roman_tuple = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']
        # 記錄結果的字串
        result_str = ""
        # 從整數的列表中開始遍歷
        for i in range(len(num_tuple)):
            # 從大往小開始判斷,num小於當前數則進行下一次迴圈
            # num大於當前數則進行減法運算,並取出相應位置的Roman數
            while num >= num_tuple[i]:
                num -= num_tuple[i]
                result_str += roman_tuple[i]
        return result_str