刷题记录| 豆包MarsCode AI 刷题

141 阅读3分钟

数字分组求偶数和

  • 问题描述

    小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数

  • 任务目标

    目标是使得这个新数的各位数字之和为偶数。—— 换句话说,任务是计算出有多少种不同的分组和选择方法可以达到这一目标。

  • 提示

    numbers: 一个由多个整数字符串组成的列表,每个字符串可以视为一个数字组。 需要从每个数字组中选择一个数字。      
    并且该新生成数的各个位上的数是按照第一、二、三......的数组中的顺序表示的

笔记1-1.png

核心关键代码——生成不同的组合并判断是否为偶数

// 递归生成组合
    private static int generateCombinations(List<List<Integer>> groups, int index, int currentSum, int count) {
        // 如果已经生成了所有组合
        if (index == groups.size()) {
            // 判断当前组合的和是否为偶数
            if (currentSum % 2 == 0) {
                count++;
            }
            return count;
        }

        // 遍历当前组的每个数字
        for (int num : groups.get(index)) {
            // 递归生成下一个组合
            count = generateCombinations(groups, index + 1, currentSum + num, count);
        }

        return count;
    }

生成组合的思路——引自MarsCode

递归生成组合:

        我们需要从每个数字组中选择一个数字,并生成所有可能的组合。

  使用递归的方式可以很方便地实现这一点。

递归函数的设计:

        递归函数需要接收当前处理的组索引 index、当前组合的和 currentSum 以及符合条件的组合数量 count。

        当处理完所有组时(即 index 等于组的数量),判断当前组合的和是否为偶数,如果是,则 count 加 1。

       否则,遍历当前组的每个数字,递归调用生成下一个组合。

详细步骤——引自MarsCode

递归终止条件:

       当 index 等于 groups.size() 时,表示已经处理完所有组。

      此时,判断 currentSum 是否为偶数,如果是,则 count 加 1。

递归调用:

      遍历当前组的每个数字 num。

      递归调用 generateCombinations,传入下一个组的索引 index + 1,更新当前组合的和 currentSum + num,以及当前的 count。

返回结果:

      递归函数返回符合条件的组合数量 count。

核心部分代码————模拟执行过程(不是程序真正的递归过程)

未命名文件.png

优化思考

在我列出所有的可能后:

      我们不难发现,每一个前缀组合相同的情况下,最后一个数的奇偶性,决定了是否满足目标。

      

      大概就是,求和为偶数:

                                前缀为偶数,那么最后一位必须为偶数

                                前缀为奇数,那么最后一位必须为奇数

那么,凭借这个特性,我们是否可以进行一些优化的可能,减少一层的递归,优化时间复杂度和空间复杂度

优化会在后续时间充裕的情况下给出

总结与计划

由于算法能力较弱,会多时候都在有解题思虑后,先看一些代码案例,在根据自己的想法,进行练习。但有了豆包MarsCode AI后,而且是一个月的现在使用思路提示和伪代码提示,甚至是代码都已经可以很好的ac了。而且豆包MarsCode AI的针对性确实很强,能够满足了对于解题的大部分需求。我会在后续的刷题过程中,尝试AI的各种能力用来辅助

第一次在掘金上写,不太习惯,也不太会用,还请多多包涵,图解没有太清楚可以看一看这里