題目
羅馬數字以七個不同的符號表示:I
、V
、X
、L
、C
、M
。
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
羅馬數字通常從左到右從最大到最小書寫。不過有六種使用減法的情況:
I
在V
(5) 和X
(10) 之前會組成 4 和 9。X
在L
(50) 和C
(100) 之前會組成 40 和 90。C
在D
(500) 和M
(1000) 之前會組成 400 和 900。
題目會給定一個羅馬數字字串,需將其轉換為整數。
解題思路
題目說了羅馬數字是由大到小書寫,所以只需要從頭開始遍歷往下加,不過要注意六種特殊情況。
- 首先依據羅馬數字每個符號與對應的值建一個 map
const romanMap = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000
}
- 接著從前往後遍歷輸入的羅馬數字字串
- 當前的羅馬數字符號的值比下一個羅馬數字符號的值還小,需要減去當前羅馬數字符號的值 比如: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
};