[LeetCode] 12. Integer to Roman (JS)

[LeetCode] 12. Integer to Roman (JS)

題目

這題跟 13.Roman to Integer 是同類型題目,只不過這題是將整數轉為羅馬數字。

羅馬數字以七個不同的符號表示:IVXLCM

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

羅馬數字通常從左到右從最大到最小書寫。不過有六種使用減法的情況:

  • IV (5) 和 X (10) 之前會組成 4 和 9。
  • XL (50) 和 C (100) 之前會組成 40 和 90。
  • CD (500) 和 M (1000) 之前會組成 400 和 900。

解題思路

  1. 首先依據羅馬數字每個符號與對應的值建一個 map。 羅馬數字是由大到小書寫,為了處理方便,romanMap 也應該改成由大到小排序。
const romanMap = {
    M: 1000,
    CM: 900,
    D: 500,
    CD: 400,
    C: 100,
    XC: 90,
    L: 50,
    XL: 40,
    X: 10,
    IX: 9,
    V: 5,
    IV: 4,
    I: 1
}
  1. 接著從前往後遍歷 romanMap keys
    • 檢查 num 是否大於等於當前羅馬數字符號的值
      • 是:將對應的羅馬數字符號加到 result 中,並從 num 中減去該羅馬數字符號的值
      • 否:不做任何事
    • 繼續這個過程直到 num 小於羅馬數字符號的值,再繼續處理下一個羅馬數字符號
  2. 返回 result

完整程式碼

/**
 * @param {number} num
 * @return {string}
 */
const romanMap = {
    M: 1000,
    CM: 900,
    D: 500,
    CD: 400,
    C: 100,
    XC: 90,
    L: 50,
    XL: 40,
    X: 10,
    IX: 9,
    V: 5,
    IV: 4,
    I: 1
}

var intToRoman = function(num) {
    const keys = Object.keys(romanMap)
    let result = ''

    for (key of keys) {
        const value = romanMap[key]
        while (num >= romanMap[key]) {
            result += key
            num -= romanMap[key]
        }
    }

    return result
};
guest

0 評論
內聯回饋
查看全部評論