打卡第一天 | 豆包MarsCode AI刷题

85 阅读3分钟

说明:本篇笔记基于python语言写出

数字分组求偶数和

问题描述

小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。

  • numbers: 一个由多个整数字符串组成的列表,每个字符串可以视为一个数字组。小M需要从每个数字组中选择一个数字。

例如对于[123, 456, 789],14个符合条件的数为:147 149 158 167 169 248 257 259 268 347 349 358 367 369

代码思路

  1. 拆分数字

    • 首先,我们将输入的每个数字拆分成单个数字。例如,数字 123 会被拆分成 [1, 2, 3]
    • 这一步通过将每个数字转换为字符串,然后逐个字符转换为整数来实现。
  2. 生成组合

    • 我们使用递归函数 generate_combinations 来生成所有可能的组合。
    • 递归函数的参数包括当前处理的组索引 group_index 和当前组合的数字和 current_sum
    • 当 group_index 等于组的数量时,表示已经生成了一个完整的组合,此时检查 current_sum 是否为偶数,如果是,则计数加一。
  3. 递归生成组合

    • 对于当前组中的每个数字,递归调用 generate_combinations,并将 group_index 加一,current_sum 加上当前数字。
    • 递归调用会继续生成下一个组的组合,直到所有组都处理完毕。
  4. 返回结果

    • 最终返回满足条件的组合数。

解答

    # 将每个数字拆分成单个数字
    groups = [[int(digit) for digit in str(num)] for num in numbers]
    
    # 生成所有可能的组合并检查和是否为偶数
    def generate_combinations(group_index, current_sum):
        if group_index == len(groups):
            return 1 if current_sum % 2 == 0 else 0
        
        count = 0
        for digit in groups[group_index]:
            count += generate_combinations(group_index + 1, current_sum + digit)
        
        return count
    
    return generate_combinations(0, 0)

if __name__ == "__main__":
    # 测试用例
    print(solution([123, 456, 789]) == 14)
    print(solution([123456789]) == 4)
    print(solution([14329, 7568]) == 10)

总结

组合数学

  • 计算组合数是解题的基础。需要理解从多个集合(这里是数字组)中各取一个元素组成新组合的方式数量是各集合元素个数的乘积。例如有k个数字组,第i个数字组有ni个数字,那么总的组合数就是n1×n2×.....×nk

数字和的计算与奇偶性判断

  • 要会计算所选取数字组成新数后的各位数字之和。例如对于组合后的数字如147,要计算1+4+7得到数字和。
  • 同时,需要掌握判断数字和奇偶性的知识,偶数是能被 整除的整数,通过判断数字和能否被2整除来确定其奇偶性。