问题描述
小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):
def count_even_sum_combinations(index, current_digits):
# 递归函数,用于计算符合条件的选择方式的数量
if index == len(numbers):
# 如果已经遍历完所有数字组
if sum(current_digits) % 2 == 0:
return 1
return 0
count = 0
for digit in str(numbers[index]):
# 选择当前数字组中的一个数字
count += count_even_sum_combinations(index + 1, current_digits + [int(digit)])
return count
return count_even_sum_combinations(0, [])
if __name__ == "__main__":
# You can add more test cases here
print(solution([123, 456, 789]) == 14)
print(solution([123456789]) == 4)
print(solution([14329, 7568]) == 10)
我的思考
1. 代码可读性
- 变量命名:确保变量名清晰且有意义。例如,
count_even_sum_combinations是一个很好的函数名,但可以考虑将index和current_digits改为更有意义的名称,如group_index和selected_digits。 - 注释:在关键步骤添加注释,解释代码的意图。这不仅有助于他人理解你的代码,也有助于你自己回顾代码时快速理解。
2. 函数拆分
- 模块化:将代码拆分为更小的函数,每个函数只做一件事。例如,可以将
is_even_sum函数独立出来,而不是在递归函数中直接判断。
3. 递归优化
- 记忆化:当前的递归实现可能会导致重复计算。可以考虑使用记忆化技术(如使用字典存储已经计算过的结果)来优化递归。
4. 错误处理
- 输入验证:在函数开始时,添加对输入的验证,确保
numbers是一个列表,并且每个元素都是有效的数字字符串。
5. 测试用例
- 边界测试:添加更多的测试用例,特别是边界情况,如空列表、单个数字组、包含非数字字符的字符串等。
6. 性能优化
- 时间复杂度分析:分析代码的时间复杂度,考虑是否有更高效的算法或数据结构可以替代当前的实现。