这是我做了快两年前端第一次做的算法题,为什么突然开始做呢,因为我想开(始卷)了!
题目要求:输入罗马数字根据一定规则转换成对应整数
我的思路:如果没有那个特殊规则,那么只需要将输入的罗马数字(字符串)拆分成一个个字符组成的数组,然后进行转换,得到所有单个罗马数字对应转换出来的整数组成的数组,之后进行从左至右相加。但是由于那个特殊规则,我需要在一个加一个之前判断是否存在前一位比后一位罗马数字小的情况,存在这种情况,就需要进行减法,减去那个小的罗马数字,所以我想到了数组的一个reduceRight的方法,它做的就是从右至左进行两位元素的累计计算,如果当前数字比右边数字小,那么就进行减法。
正常情况:[M,C,I] 转换成 [1000 ,10 ,1] 再通过reduceRight转换成 1+10+1000 =1011
特殊情况:[M,I,C] 转换成 [1000 ,1 ,10] 再通过reduceRight转换成 10-1+1000 =1009
/**
* @param {string} s
* @return {number}
*/
const romanToInt = function (s) {
const arr = s.split("")
const numArr = []
arr.forEach(el => {
switch (el) {
case "I": numArr.push(1)
break;
case "V": numArr.push(5)
break;
case "X": numArr.push(10)
break;
case "L": numArr.push(50)
break;
case "C": numArr.push(100)
break;
case "D": numArr.push(500)
break;
case "M": numArr.push(1000)
break;
}
})
return numArr.reduceRight((pre, cur, index, arr) => {
if (arr[index] < arr[index + 1]) {
return pre - cur
} else {
return pre + cur
}
})
};