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);
};