数字分组求偶数和
-
问题描述
小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数。
-
任务目标
目标是使得这个新数的各位数字之和为偶数。—— 换句话说,任务是计算出有多少种不同的分组和选择方法可以达到这一目标。
-
提示
numbers: 一个由多个整数字符串组成的列表,每个字符串可以视为一个数字组。 需要从每个数字组中选择一个数字。
并且该新生成数的各个位上的数是按照第一、二、三......的数组中的顺序表示的
核心关键代码——生成不同的组合并判断是否为偶数
// 递归生成组合
private static int generateCombinations(List<List<Integer>> groups, int index, int currentSum, int count) {
// 如果已经生成了所有组合
if (index == groups.size()) {
// 判断当前组合的和是否为偶数
if (currentSum % 2 == 0) {
count++;
}
return count;
}
// 遍历当前组的每个数字
for (int num : groups.get(index)) {
// 递归生成下一个组合
count = generateCombinations(groups, index + 1, currentSum + num, count);
}
return count;
}
生成组合的思路——引自MarsCode
递归生成组合:
我们需要从每个数字组中选择一个数字,并生成所有可能的组合。
使用递归的方式可以很方便地实现这一点。
递归函数的设计:
递归函数需要接收当前处理的组索引 index、当前组合的和 currentSum 以及符合条件的组合数量 count。
当处理完所有组时(即 index 等于组的数量),判断当前组合的和是否为偶数,如果是,则 count 加 1。
否则,遍历当前组的每个数字,递归调用生成下一个组合。
详细步骤——引自MarsCode
递归终止条件:
当 index 等于 groups.size() 时,表示已经处理完所有组。
此时,判断 currentSum 是否为偶数,如果是,则 count 加 1。
递归调用:
遍历当前组的每个数字 num。
递归调用 generateCombinations,传入下一个组的索引 index + 1,更新当前组合的和 currentSum + num,以及当前的 count。
返回结果:
递归函数返回符合条件的组合数量 count。
核心部分代码————模拟执行过程(不是程序真正的递归过程)
优化思考
在我列出所有的可能后:
我们不难发现,每一个前缀组合相同的情况下,最后一个数的奇偶性,决定了是否满足目标。
大概就是,求和为偶数:
前缀为偶数,那么最后一位必须为偶数
前缀为奇数,那么最后一位必须为奇数
那么,凭借这个特性,我们是否可以进行一些优化的可能,减少一层的递归,优化时间复杂度和空间复杂度
优化会在后续时间充裕的情况下给出
总结与计划
由于算法能力较弱,会多时候都在有解题思虑后,先看一些代码案例,在根据自己的想法,进行练习。但有了豆包MarsCode AI后,而且是一个月的现在使用思路提示和伪代码提示,甚至是代码都已经可以很好的ac了。而且豆包MarsCode AI的针对性确实很强,能够满足了对于解题的大部分需求。我会在后续的刷题过程中,尝试AI的各种能力用来辅助