题目简述:找到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
所以上面的代码还是存在问题,要重新整理下了
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
};