【leetcode】13. 罗马数字转整数

43 阅读1分钟

leetcode-13.png

刚开始想的比较耿直,代码也比较啰嗦,啰嗦完了,还不能解决问题

错误代码

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

测试用例
出现两次高位上的字母,上面的代码无法解决问题 测试用例.png

正确代码

直接判断相邻的两个字母的大小即可,如果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
};