4数字分组求偶数和| 豆包MarsCode AI刷题

50 阅读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 def 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) ### 代码解析

  1. 函数定义与初始化

    • solution(numbers) 是主函数,接受一个由多个整数字符串组成的列表 numbers
    • count 是一个全局变量,用于记录符合条件的组合数量。
  2. 递归辅助函数

    • calculate(index, current_sum) 是一个递归函数,用于计算所有可能的组合。
    • index 表示当前处理的数字组在 numbers 列表中的索引。
    • current_sum 表示当前组合的数字和。
  3. 递归终止条件

    • 当 index 等于 len(numbers) 时,表示已经处理完所有的数字组。此时检查 current_sum 是否为偶数,如果是,则 count 加 1。
  4. 递归处理

    • 对于当前的数字组 current_group,遍历其中的每一个数字 digit
    • 将 digit 转换为整数,并递归调用 calculate 函数,传入下一个数字组的索引和更新后的 current_sum
  5. 主函数调用

    • 在 __main__ 函数中,调用 solution 函数并打印结果,验证是否符合预期。

代码逻辑

  • 递归遍历:通过递归遍历所有可能的组合,确保每个数字组中的每个数字都被考虑到。
  • 和的检查:在递归的每一层,累加当前数字到 current_sum,并在递归结束时检查 current_sum 是否为偶数。
  • 计数:通过全局变量 count 记录符合条件的组合数量。

优化建议

  • 记忆化:可以考虑使用记忆化技术来避免重复计算,特别是在处理大量数据时。
  • 剪枝:在递归过程中,如果发现 current_sum 已经不可能成为偶数,可以提前终止递归,减少不必要的计算。