问题描述
小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
解题思路
-
理解偶数和的条件:
- 偶数和的条件是:所有选出的数字的和必须是偶数。
- 偶数和的构成:偶数 + 偶数 = 偶数,奇数 + 奇数 = 偶数。
-
数据结构的选择:
- 我们可以使用递归或迭代的方式来遍历所有可能的组合。
- 使用一个列表来存储当前选择的数字。
-
算法步骤:
-
初始化:
- 初始化两个计数器:
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