【leetcode】整數轉羅馬數字【Python】
阿新 • • 發佈:2018-12-14
題目連結 遞迴演算法,需要注意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