刷题系列 - 数字分组求偶数和

43 阅读1分钟

1.问题描述

小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。

  • numbers: 一个由多个整数字符串组成的列表,每个字符串可以视为一个数字组。小M需要从每个数字组中选择一个数字。

例如对于[123, 456, 789],14个符合条件的数为:147 149 158 167 169 248 257 259 268 347 349 358 367 369

2.测试样例

样例1:

输入:numbers = [123, 456, 789]
输出:14

样例2:

输入:numbers = [123456789]
输出:4

样例3:

输入:numbers = [14329, 7568]
输出:10

3.代码

function solution(numbers = []) {
  let dp = [[1, 0]];
  numbers.forEach((num, i) => {
    const num_arr = String(num).split('');
    let odd_count = 0;// 奇数个数
    let even_count = 0;// 偶数个数
    num_arr.forEach(n => {
      if (Number(n) % 2 === 1) {
        odd_count += 1
      } else {
        even_count += 1
      }
    })
    // [0]是偶数的方案,[1]是奇数的方案,偶数是偶数*偶数个+奇数*奇数个 奇数是奇数*偶数个+偶数*奇数个
    dp.push([dp[i][0] * even_count + dp[i][1] * odd_count, dp[i][1] * even_count + dp[i][0] * odd_count])
  })
  return dp[numbers.length][0];
}

function main() {
  console.log(solution([123, 456, 789]) === 14);
  console.log(solution([123456789]) === 4);
  console.log(solution([14329, 7568]) === 10);
}

main();