Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
- 題目大意
將一個羅馬數字轉化為整數
對于如何將整數轉為羅馬數字 請看這篇
國人可能對于羅馬數字比較陌生,首先來熟悉一下羅馬數字的規則:
羅馬數字共有7個,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、?(50)、?(100)、?(500)和?(1000)。(維基百科)
羅馬數字 | I | V | X | L | C | D | M |
---|---|---|---|---|---|---|---|
整數 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
- 一個羅馬數字重復幾次,就表示這個數的幾倍。最多3次
- 右加左減:
在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字。
在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字減小數字。V,L,D 不能放在大數的左邊;左減時不可跨越一個位值。比如,99不可以用IC表示,而是用XCIX表示。 - 在羅馬數字的上方加上一條橫線或者加上下標,表示將這個數乘以1000。 (在該題目中用不到,因為只用考慮4000以內的數字)
對于左減時不可跨越一個位值,可能比較難理解,具體來說,就是
I只能放在V,X左邊
X只能放在L,C左邊
C只能放在D, M左邊
知道了規則,再來處理這個問題就非常簡單了。我們只需要按順序遍歷羅馬數字,當遇到右邊的數字比左邊的小,就用加法;否則用減法;
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function (s) {
const ronmanNums = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
};
return s.split('')
.reduce((prev, d, i, arr) => {
const currentNum = ronmanNums[d];
if ((i === arr.length - 1) || (currentNum >= ronmanNums[arr[i + 1]])) { //最后一位或者右邊的數字比當前的小,使用加法
return prev + currentNum;
}
else {
return prev - currentNum;
}
}, 0);
};