2023-10-15|閱讀時間 ‧ 約 4 分鐘

應用題 從阿拉伯數字轉成羅馬數字 Leetcode 12: Integer to Roman

這題的題目在這裡:

題目會給定我們一組十進位表示法的阿拉伯數字,要求我們把它轉換為對應的羅馬數字。


測試範例

Example 1:

Input: num = 3
Output: "III"
Explanation: 3 is represented as 3 ones.

Example 2:

Input: num = 58
Output: "LVIII"
Explanation: L = 50, V = 5, III = 3.

Example 3:

Input: num = 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.



約束條件

Constraints:

  • 1 <= num <= 3999

演算法

把原本題目給的羅馬數字和十進位數字的關係建立成一張映射表(字典)。

Symbol       Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

把每一個羅馬數字由大到小排列,當作基底,做數字的轉換。

每一輪除法留下來的商數就是對應羅馬數字所需要的係數,餘數帶入下一輪轉換,一直反覆進行,直到個位數為止。


程式碼

class Solution:
 def intToRoman(self, num: int) -> str:
  
## dictionary:
# key: decimal value as base
# value: corresponding roman symbol
  mapping_table = {
       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"
  }
  
  roman_string = ''
  
# represent input num in roman number system
  for base, roman_symbol in mapping_table.items():
   
# update roman string with corresponding roman symbol
   roman_string += (num // base) * roman_symbol
   
# update num as remainder
   num = num % base
  

  return roman_string



複雜度分析

時間複雜度: O( 1)
從左到右,每個羅馬數字對應的基底掃描過一遍。

空間複雜度: O(1)
都是臨時變數,所占用的記憶體空間為常數級別O(1)


關鍵知識點

想到用字典(雜湊映射表),去儲存每個羅馬數字和十進位表示裡面對應到的阿拉伯數字的映射關係。

​本題有一個對稱的兄弟姊妹題 Roman to Integer,可以互相做為學習、比較的參照。


Reference:

[1] Python/C++ by mapping and math [w/ Comment] - Integer to Roman - LeetCode

分享至
成為作者繼續創作的動力吧!
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
© 2024 vocus All rights reserved.