问题描述
小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]
输出:10def solution(numbers): # Helper function to recursively calculate all possible number combinations def calculate(index, current_sum): nonlocal count
if index == len(numbers):
# If we've reached the end of the groups, check if the sum is even
if current_sum % 2 == 0:
count += 1
return
# Ensure the current element is a string
current_group = str(numbers[index])
# Iterate over each digit in the current number group
for digit in current_group:
# Convert digit character to integer and add to the sum
calculate(index + 1, current_sum + int(digit))
count = 0
calculate(0, 0)
return count
if name == "main": print(solution(['123', '456', '789']) == 14) print(solution(['123456789']) == 4) print(solution(['14329', '7568']) == 10) ### 代码解析
-
函数定义与初始化:
solution(numbers)是主函数,接受一个由多个整数字符串组成的列表numbers。count是一个全局变量,用于记录符合条件的组合数量。
-
递归辅助函数:
calculate(index, current_sum)是一个递归函数,用于计算所有可能的组合。index表示当前处理的数字组在numbers列表中的索引。current_sum表示当前组合的数字和。
-
递归终止条件:
- 当
index等于len(numbers)时,表示已经处理完所有的数字组。此时检查current_sum是否为偶数,如果是,则count加 1。
- 当
-
递归处理:
- 对于当前的数字组
current_group,遍历其中的每一个数字digit。 - 将
digit转换为整数,并递归调用calculate函数,传入下一个数字组的索引和更新后的current_sum。
- 对于当前的数字组
-
主函数调用:
- 在
__main__函数中,调用solution函数并打印结果,验证是否符合预期。
- 在
代码逻辑
- 递归遍历:通过递归遍历所有可能的组合,确保每个数字组中的每个数字都被考虑到。
- 和的检查:在递归的每一层,累加当前数字到
current_sum,并在递归结束时检查current_sum是否为偶数。 - 计数:通过全局变量
count记录符合条件的组合数量。
优化建议
- 记忆化:可以考虑使用记忆化技术来避免重复计算,特别是在处理大量数据时。
- 剪枝:在递归过程中,如果发现
current_sum已经不可能成为偶数,可以提前终止递归,减少不必要的计算。