【LCP】40.心算挑战

110 阅读2分钟

LCP-40.png

题目简述:找到cnt张牌,使其总和为偶数,且总和最大。

思路:这里首先想到的就是逆序排序,然后把前cnt个数字相加
如果是偶数,直接返回
如果是奇数,如果最后一位,也就是index = cnt-1位是偶数,那么继续寻找一位奇数,来进行替换;如果最后一位是奇数,继续寻找一位偶数进行替换。

但是下面的解法不能ac

var maxmiumScore = function (cards, cnt) {
    cards.sort((a, b) => b - a)
    let sum = 0
    for (let i = 0; i < cnt; ++i) {
        sum += cards[i]
    }
    if (sum % 2 === 0) {
        return sum
    } else {
        let sum1 = -Infinity, sum2 = -Infinity
        if (cards[cnt - 1] % 2 === 0) {
            // find odd
            let odd = findNum(cards, cnt, 'odd')
            if (odd !== null) {
                sum1 = sum - cards[cnt - 1] + odd
            } else {
                sum1 = sum - cards[cnt - 1]
            }
        } else {
            let even = findNum(cards, cnt, 'even')
            if (even !== null) {
                sum2 = sum - cards[cnt - 1] + even
            } else {
                sum2 = sum - cards[cnt - 1]
            }
        }
        return sum1 > sum2 ? sum1 : sum2
    }
};

var findNum = function (cards, index, type) {
    for (let i = index; i < cards.length; ++i) {
        if (type === 'even' && cards[i] % 2 === 0) {
            return cards[i]
        } else if (type === 'odd' && cards[i] % 2 !== 0) {
            return cards[i]
        }
    }
    return null
}

下面的测试用例无法通过

[1,3,4,5] cnt = 4

在第10行增加如下代码之后,能通过,但是又出现新的不能通过的测试用例

if (cnt >= cards.length) return 0

很显然这里是选择 9 9,而不是 10 6 不能通过的测试用例.png

所以上面的代码还是存在问题,要重新整理下了

var maxmiumScore = function (cards, cnt) {
    cards.sort((a, b) => b - a)
    let sum = 0
    let odd = -1
    let even = -1
    for (let i = 0; i < cnt; ++i) {
        sum += cards[i]
        // 找到最小的奇数以及偶数
        if (cards[i] % 2 === 0) {
            even = cards[i]
        } else {
            odd = cards[i]
        }
    }
    // 如果总和是偶数,直接return
    if (sum % 2 === 0) {
        return sum
    }
    // 总和是奇数
    let res = 0
    for (let i = cnt; i < cards.length; ++i) {
        if (cards[i] % 2 !== 1) {
            // 找到的下一个是偶数,那么就要替换之前sum里面的一个奇数
            if (odd !== -1) {
                res = Math.max(res, sum - odd + cards[i])
            }
        } else {
            // 找到的下一个是偶数,那么就要替换之前sum里面的一个奇数
            if (even !== -1) {
                res = Math.max(res, sum - even + cards[i])
            }
        }
    }
    return res
};