数字分组求偶数和(javascript版)-豆包marscode算法刷题

144 阅读2分钟

问题描述

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

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

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

测试样例

样例1:

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

样例2:

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

样例3:

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

题解

function solution(numbers) {
 // 将输入的数字转换为数字列表
 const digitGroups = numbers.map(numStr => numStr.toString().split('').map(Number));

 // 递归生成所有可能的组合
 function generateCombinations(index, currentCombination) {
     if (index === digitGroups.length) {
         // 计算当前组合的数字之和
         const sum = currentCombination.reduce((acc, digit) => acc + digit, 0);
         // 检查和是否为偶数
         if (sum % 2 === 0) {
             evenSumCount++;
         }
         return;
     }

     const currentGroup = digitGroups[index];
     for (let digit of currentGroup) {
         generateCombinations(index + 1, [...currentCombination, digit]);
     }
 }

 let evenSumCount = 0;
 generateCombinations(0, []);

 return evenSumCount;
}

function main() {
  // You can add more test cases here
  console.log(solution([123, 456, 789]) === 14);
  console.log(solution([123456789]) === 4);
  console.log(solution([14329, 7568]) === 10);
}

main();

解题思路

  1. 解析输入

    • digitGroups 是一个二维数组,其中每个子数组包含一个数字组中的所有数字。
    • 例如,对于输入 [123, 456, 789]digitGroups 将是 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  2. 生成所有可能的组合

    • 使用递归函数 generateCombinations 来生成所有可能的组合。
    • index 表示当前处理的数字组索引。
    • currentCombination 是当前构建的组合。
  3. 计算组合的数字之和

    • 当 index 达到 digitGroups.length 时,表示已经构建了一个完整的组合。
    • 使用 reduce 方法计算当前组合的数字之和。
  4. 检查和是否为偶数

    • 如果数字之和为偶数,则增加 evenSumCount 计数器。
  5. 返回结果

    • 最终返回 evenSumCount,即满足条件的组合数量。