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

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

我的解法

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. 性能优化

  • 时间复杂度分析:分析代码的时间复杂度,考虑是否有更高效的算法或数据结构可以替代当前的实现。