数字分组求偶数和 递归的妙用 | 豆包MarsCode AI 刷题

91 阅读3分钟

问题描述

小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

问题理解

我们发现,由于这个列表的长度为一到九不等,而单纯的循环嵌套表达能力是有局限的,所以通过暴力遍历获取每一个可能的对象是很困难的,这道题的原问题为构造长度为n的字符串,子问题为构造长为n-1的字符串,子问题和原问题时相似的因此我们可以使用递归的思路,通过递归可以达到多重循环的效果.而这种增量构造答案的过程也就是回溯,通常使用递归实现

解题思路

处理这种回溯的问题,我们需要先思考当前的操作是什么,当前这道题就是枚举第i个字符串的数字.然后再考虑子问题是什么,也就是所组成的数i+1以及之后的部分 具体来说,在运行时,如果已经构建了足够长的一个数字(即长度等于列表的长度),那么就需要进行判断是否符合条件,而如果长度不够,就对列表中的下一个部分进行递归,依次来构建一个数字并判断,需要注意的是,由于我这里使用的pre是一个全局变量,在每次递归结束后要进行还原现场,所以需要减去.

时间复杂度O(m^n),其中 m 是每个数字组的长度,n 是数字组的数量。
空间复杂度O(n),其中 n 是数字组的数量。

本题总结

本题围绕从给定的多个数字组中选择数字来组成新数展开,新数需满足各位数字之和为偶数这一条件,任务是计算出能达到此目标的不同分组和选择方法的数量。

其难点在于给定的数字组列表长度不一,取值范围从一到九不等,单纯依靠常规的循环嵌套进行暴力遍历获取所有可能组合的方式难度极大,因为其表达能力有限,难以涵盖所有情况。

针对这一难题,解题采用了递归与回溯的思路。具体通过定义内部函数来实现递归操作,在函数内部,对于每个数字组中的数字依次进行处理,累加当前构建数字的各位数字之和,并根据索引判断是否到达列表末尾来决定是继续递归构建还是进行最终的条件判断。若各位数字之和为偶数,则符合条件的组合数量加一。