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

35 阅读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

解题思路

  1. 理解偶数和的条件

    • 偶数和的条件是:所有选出的数字的和必须是偶数。
    • 偶数和的构成:偶数 + 偶数 = 偶数,奇数 + 奇数 = 偶数。
  2. 数据结构的选择

    • 我们可以使用递归或迭代的方式来遍历所有可能的组合。
    • 使用一个列表来存储当前选择的数字。
  3. 算法步骤

    • 初始化

      • 初始化两个计数器:even_count 和 odd_count,分别表示当前组合中偶数和奇数的组合数。
      • 初始值为1,因为至少有一种选择(即不选择任何数字)。
    • 遍历每个数字组

      • 对于每个数字组,统计其中的偶数和奇数的数量。

      • 更新 even_count 和 odd_count

        • new_even_count = even_count * 当前数字组中的偶数数量 + odd_count * 当前数字组中的奇数数量
        • new_odd_count = even_count * 当前数字组中的奇数数量 + odd_count * 当前数字组中的偶数数量
      • 更新 even_count 和 odd_count 为 new_even_count 和 new_odd_count

    • 返回结果

      • 最终返回 even_count,因为我们需要的是偶数和的组合数。

总结

  • 理解偶数和的条件:偶数和的构成是偶数 + 偶数 = 偶数,奇数 + 奇数 = 偶数。
  • 数据结构的选择:使用递归或迭代的方式来遍历所有可能的组合。
  • 算法步骤:初始化计数器,遍历每个数字组,更新计数器,最终返回符合条件的组合数。

python题解

def solution(numbers):
    even_count = 0  # 记录偶数选择的组合数  
    odd_count = 0   # 记录奇数选择的组合数  
 
    # 初始情况下,没有任何选择,所以组合数为0
    even_count = 1  # 初始化为1,因为至少有一种选择(即不选择任何数字)
 
    for num in numbers:
        even = 0
        odd = 0
        str_num = str(num)
 
        # 统计当前数字组中的偶数和奇数  
        for ch in str_num:
            if int(ch) % 2 == 0:
                even += 1
            else:
                odd += 1
 
        # 更新组合数  
        new_even_count = even_count * even + odd_count * odd  # 偶数和偶数的组合 + 奇数和奇数的组合
        new_odd_count = even_count * odd + odd_count * even    # 偶数和奇数的组合
 
        even_count = new_even_count
        odd_count = new_odd_count
 
    # 返回符合条件的组合数(偶数和的组合)  
    return even_count  # 返回偶数和的组合数
 
# 测试用例
if __name__ == "__main__":
    print(solution([123, 456, 789]) == 14)  # 应输出 True
    print(solution([123456789]) == 4)       # 应输出 True
    print(solution([14329, 7568]) == 10)    # 应输出 True