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

122 阅读5分钟

问题描述

小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


题目背景

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

代码思路

首先,定义了一个名为 solution 的函数,该函数接收一个参数 numbers,这是一个由多个整数字符串组成的列表。每个字符串代表一个数字组,小M需要从每个数字组中选择一个数字来构造新的数。

在 solution 函数内部,定义了一个辅助递归函数 helper,它接受三个参数:

index: 当前处理的数字组的索引。 current_sum: 目前为止选择的所有数字之和。 current_digits: 当前选择的所有数字构成的字符串。

helper 函数的工作原理如下:

如果 index 达到了 numbers 列表的长度,说明所有数字组都已经被处理过了。此时检查 current_sum 是否为偶数,如果是,则将 current_digits 添加到结果集合 results 中。 对于当前数字组(由 str(numbers[index]) 转换而来),遍历该组中的每一个数字,递归调用 helper 函数,同时更新 current_sum 和 current_digits 的值。 最后,初始化一个空的集合 results 用于存储所有满足条件的不同组合,并调用 helper 函数开始递归处理。最终返回 results 集合的大小作为答案。

测试案例分析

样例1:输入 [123, 456, 789],输出 14。这是因为从每个数字组中选择一个数字,可以构造出14个不同的数,其各位数字之和为偶数。 样例2:输入 [123456789],输出 4。因为只有一个数字组,所以只能从这9个数字中选择一个数,其中只有4个数字(2, 4, 6, 8)是偶数或其和为偶数。 样例3:输入 [14329, 7568],输出 10。这里可以从第一个数字组中选择5个数字(1, 3, 4, 2, 9),从第二个数字组中选择4个数字(7, 5, 6, 8),通过适当的组合,可以得到10个不同的数,其各位数字之和为偶数。

代码分析

函数定义:

def solution(numbers):

solution 是主函数,接收一个参数 numbers,这是一个由多个整数字符串组成的列表。

辅助递归函数:

def helper(index, current_sum, current_digits):

helper 是一个递归函数,用于处理每个数字组的选择。 index:当前处理的数字组的索引。 current_sum:目前选择的所有数字之和。 current_digits:当前选择的所有数字构成的字符串。

递归终止条件:

if index == len(numbers):
    if current_sum % 2 == 0:
        results.add(current_digits)
    return

如果 index 达到了 numbers 列表的长度,说明所有数字组都已经被处理过。 检查 current_sum 是否为偶数,如果是,则将 current_digits 添加到结果集合 results 中。 递归结束,返回上一级调用。 处理当前数字组:

for digit in str(numbers[index]):
    helper(index + 1, current_sum + int(digit), current_digits + digit)

将当前数字组转换为字符串,以便逐个处理每个数字。 遍历当前数字组中的每个数字 digit。 递归调用 helper 处理下一个数字组,同时更新 current_sum 和 current_digits。 初始化结果集合:

results = set()

初始化一个空的集合 results,用于存储所有满足条件的数字组合。 开始递归处理:

helper(0, 0, "")

调用 helper 函数开始递归处理,初始索引为0,当前数字之和为0,当前数字组合为空字符串。 返回结果:

return len(results)

返回结果集合 results 的大小,即满足条件的数字组合数量。 测试用例:

if __name__ == "__main__":
    print(solution([123, 456, 789]) == 14)  # 应输出 True
    print(solution([123456789]) == 4)       # 应输出 True
    print(solution([14329, 7568]) == 10)    # 应输出 True

运行几个测试用例,验证 solution 函数的正确性。

优化思考

虽然解决方案能够正确地解决问题,但在某些情况下可能不是最高效的,特别是当数字组的数量和每个数字组的大小都很大时。

所以我们可以通过预处理每个数字组的奇偶性分布,以及使用动态规划的方法来减少不必要的重复计算,从而提高效率。但是,对于题目给出的规模,当前的解决方案已经足够高效且易于理解。