刚开始想的比较耿直,代码也比较啰嗦,啰嗦完了,还不能解决问题
错误代码
var romanToInt = function (s) {
let map = new Map()
map.set('I', 1)
map.set('V', 5)
map.set('X', 10)
map.set('L', 50)
map.set('C', 100)
map.set('D', 500)
map.set('M', 1000)
let flagI = false, flagX = false, flagC = false
let sum = 0
let indexI = s.indexOf('I')
let indexX = s.indexOf('X')
let indexC = s.indexOf('C')
let indexVX = Math.min(s.indexOf('V'), s.indexOf('X'))
let indexLC = Math.min(s.indexOf('L'), s.indexOf('C'))
let indexDM = Math.min(s.indexOf('D'), s.indexOf('M'))
if (indexI !== -1 && indexI < indexVX) flagI = true
if (indexX !== -1 && indexX < indexLC) flagX = true
if (indexC !== -1 && indexC < indexDM) flagC = true
for (let i = 0; i < s.length; ++i) {
if (flagI && s[i] !== 'I' && (s[i] === 'V' || s[i] === 'X')) {
sum += (map.get(s[i]) - 1)
flagI = false
}
if (flagX && s[i] !== 'X' && (s[i] === 'L' || s[i] === 'C')) {
sum += (map.get(s[i]) - 10)
flagX = false
}
if (flagC && s[i] !== 'C' && (s[i] === 'D' || s[i] === 'M')) {
sum += (map.get(s[i]) - 100)
flagX = false
}
sum += map.get(s[i])
}
return sum
};
测试用例
出现两次高位上的字母,上面的代码无法解决问题
正确代码
直接判断相邻的两个字母的大小即可,如果val[i] < val[i+1],那么就要算减法了,反之要算加法。
var romanToInt = function (s) {
let map = new Map()
map.set('I', 1)
map.set('V', 5)
map.set('X', 10)
map.set('L', 50)
map.set('C', 100)
map.set('D', 500)
map.set('M', 1000)
let sum = 0
for (let i = 0; i < s.length; ++i) {
let current = map.get(s[i])
if (i + 1 < s.length && current < map.get(s[i + 1])) {
sum -= current
}else {
sum += current
}
}
return sum
};