[LeetCode] 13. Roman to Integer (JS)

[LeetCode] 13. Roman to Integer (JS)

題目

羅馬數字以七個不同的符號表示: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
const romanMap = {
    I: 1,
    V: 5,
    X: 10,
    L: 50,
    C: 100,
    D: 500,
    M: 1000
}
  1. 接著從前往後遍歷輸入的羅馬數字字串
    • 當前的羅馬數字符號的值比下一個羅馬數字符號的值還小,需要減去當前羅馬數字符號的值 比如:IV 就是 -1 + 5 = 4, IX 就是 -1 + 10 = 9, XL 就是 -10 + 50 = 40, XC 就是 -10 + 100 = 90
    • 反之則是加
    • MCMXCIV 為例,M > C 所以是 +1000, C < M 所以是 -100, M > X 所以是 +1000, X < C 所以是 -10, C > I 所以是 + 100, I < V 所以是 -1 + 5, 最終結果就是 1000 - 100 + 1000 - 10 + 100 - 1 + 5 = 1994

完整程式碼

/**
 * @param {string} s
 * @return {number}
 */

const romanMap = {
    I: 1,
    V: 5,
    X: 10,
    L: 50,
    C: 100,
    D: 500,
    M: 1000
}

var romanToInt = function(s) {
    let total = 0
    for (let i = 0; i < s.length; i++) {
        if (romanMap[s[i]] < romanMap[s[i + 1]]) {
            total -= romanMap[s[i]]
        } else {
            total += romanMap[s[i]]
        }
    }
    return total
};
guest

0 評論
最舊
最新 最多投票
內聯回饋
查看全部評論