“数字分组求偶数和”题目分析 | 豆包MarsCode AI刷题

52 阅读4分钟

一、题目解析

1.问题理解与重述

  • 我们有一组从 1 到 9 的数字,它们被划分成了多个小组,每个小组以字符串形式表示。
  • 要求我们从每个小组中选取一个数字,组成一个新的数,并且这个新数的各位数字之和需要为偶数。
  • 我们的最终任务是计算出能满足各位数字之和为偶数这一条件的不同分组和选择方法的总数。

2.关键点分析

i. 数字分组与选择:

首先要明确每个小组内的数字都是可供选择的对象。例如在小组 “123” 中,可以选 1、2 或 3。对于给定的多个小组,需要遍历每个小组的所有可能选择情况,然后组合起来得到不同的新数。

这种从多个小组中分别进行选择并组合的过程,涉及到了排列组合的思想。因为每个小组的选择相互独立,最后要将各个小组的选择结果相乘来得到总的组合情况数(在不考虑和的奇偶性限制时)。

ii. 各位数字之和为偶数的条件:

要使得组成的新数各位数字之和为偶数,需要分析不同数字组合相加后的奇偶性。

奇数 + 奇数 = 偶数,偶数 + 偶数 = 偶数。所以在选择数字组成新数时,要么选择的数字全是偶数,要么选择的数字中有偶数个奇数。

3.代码详解

i. 函数 solution 内的前期准备工作

首先遍历输入的 numbers 列表,其中每个元素是一个表示数字组的字符串(例如 "123")。

对于每个数字组字符串,将其转换为字符列表,再通过列表推导式将每个字符转换为整数,从而得到一个由整数组成的列表,代表一个分组(如 [1, 2, 3]),并将这些分组依次添加到 groups 列表中。

同时,记录每个分组的大小(即分组中数字的个数),并将这些组大小依次添加到 group_sizes 列表中。

image.png

ii. 递归函数 generate_combinations 的作用及思路

  • 函数定义及参数含义

generate_combinations 是一个递归函数,用于生成所有可能的数字选择组合,并检查所选数字之和是否为偶数。

它接受三个参数:

index:表示当前正在处理的分组索引,用于遍历各个分组。初始值为 0,表示从第一个分组开始处理。

current_sum:记录当前已经选择的数字之和,初始值为 0,随着每次选择数字会不断累加。

count:用于统计满足各位数字之和为偶数条件的组合数量,初始值为 0。

  • 递归终止条件及处理

当 index 等于 groups 列表的长度时,意味着已经遍历完所有的分组,完成了一次完整的数字选择组合。

此时,检查 current_sum 是否能被 2 整除(即判断各位数字之和是否为偶数)。如果是偶数,则将 count 的值增加 1,表示找到了一种满足条件的组合;如果是奇数,则直接返回 count 的当前值,不做增加操作。

  • 遍历当前分组的数字选择

对于当前分组(由 index 指定),通过循环遍历该分组中的每个数字(索引范围由 group_sizes[index] 确定)。

每次选择一个数字后,递归调用 generate_combinations 函数,将 index 增加 1,表示进入下一个分组进行选择,同时将当前选择的数字累加到 current_sum 中,并将当前的 count 值传递下去。

递归调用返回的新的 count 值会更新当前的 count,以便继续统计满足条件的组合数量。

image.png

iii. 最终结果返回

函数 solution 最后调用 generate_combinations 函数,并传入初始参数 0(表示从第一个分组开始,初始和为 0,初始计数为 0),然后将 generate_combinations 函数返回的结果作为 solution 函数的最终返回值,这个返回值就是满足新数各位数字之和为偶数条件的不同分组和选择方法的数量。

image.png

iv. 测试部分

本python代码对于以下三个例子进行了检测,确保代码的正确性。

image.png

二、知识总结

本题主要考查了以下三点。

  • 对数字分组概念的理解,以及如何从不同分组中选取元素进行组合。
  • 运用排列组合的思想来计算不同选择方式的总数,要考虑到每个分组内的选择相互独立,通过乘法原理计算总的组合情况(在不考虑特定条件限制时)。
  • 数字奇偶性知识,明确奇数与偶数相加的结果规律(奇数 + 奇数 = 偶数,偶数 + 偶数 = 偶数),并根据此规律来判断所组成新数各位数字之和的奇偶性,以此作为满足题目要求的关键条件。