豆包MarsCode AI 刷题(代码练习)提升效率总结|豆包MarsCode AI 刷题

106 阅读5分钟

豆包MarsCode AI 刷题(代码练习)提升效率总结

MarsCode AI简述

引用官方的图 image.png

总而言之,豆包实际在算法练习中会出现在右边侧栏。如图: image.png

问题1:豆包是否能提升我们刷题的效率

  • 当然能!特别是在看一道题长时间没有什么思路的时候,就显得非常有用,与其上网搜索题目的答案,用AI能很快地清楚这道题用的思路,比如选择合适的数据结构、确定合适的边界、使用不同的遍历方法等等

问题2:豆包在日常训练中该如何使用

  • (小编)刚开始我刷题的时候,遇到一些不会的题,或者写了半天磨出的成堆代码通过不了。花个30分钟最后老实上网搜答案,浪费了非常多时间,一天也就刷2题,效率非常慢
  • (重点) 我认为刷题的不是闭卷的情况下刷,而是有节制的利用工具刷。我们需要在短时间内掌握大量的不同题型的解题方法,就跟训练AI一样,喂大量的数据和答案。因此有AI工具的陪练,我们可以在较短时间内刷很多道题。
例如:中等题 饭馆菜品选择问题
问题描述

小C来到了一家饭馆,这里共有 nn 道菜,第 ii 道菜的价格为 a_i。其中一些菜中含有蘑菇,s_i 代表第 ii 道菜是否含有蘑菇。如果 s_i = '1',那么第 ii 道菜含有蘑菇,否则没有 小C希望点 kk 道菜,且希望总价格尽可能低。由于她不喜欢蘑菇,她希望所点的菜中最多只有 mm 道菜含有蘑菇。小C想知道在满足条件的情况下能选出的最小总价格是多少。如果无法按照要求选择菜品,则输出-1

解题思路

只要不是立马想出答案,用什么合适的数据结构以及用什么算法处理。都可以试一试AI。 这里我点击了 “需要一点思路提示”

AI内容


好的,让我们来分析一下这个问题,并提供一些解题思路。

问题理解

  1. 输入

    • s:一个字符串,表示每道菜是否含有蘑菇。
    • a:一个整数数组,表示每道菜的价格。
    • m:一个整数,表示小C最多能接受的含有蘑菇的菜的数量。
    • k:一个整数,表示小C希望点的菜的总数。
  2. 输出

    • 一个整数,表示在满足条件的情况下能选出的最小总价格。如果无法按照要求选择菜品,则输出 -1

解题思路

  1. 数据结构选择

    • 我们可以将每道菜的信息(价格和是否含有蘑菇)存储在一个列表中,方便后续处理。
  2. 算法步骤

    • 分类:将所有菜分为两类:含有蘑菇的菜和不含有蘑菇的菜。

    • 排序:对这两类菜分别按价格进行升序排序。

    • 组合选择

      • 尝试从含有蘑菇的菜中选择 0 到 m 道菜,剩下的从不含蘑菇的菜中选择。
      • 计算每种组合的总价格,并记录最小值。
    • 边界情况

      • 如果总的菜数不足 k,直接返回 -1
      • 如果含有蘑菇的菜数不足 m,则只能从不含蘑菇的菜中选择。

具体步骤

  1. 初始化

    • 创建两个列表,分别存储含有蘑菇和不含有蘑菇的菜。
  2. 分类和排序

    • 遍历 s 和 a,将菜分类并存储到对应的列表中。
    • 对两个列表分别按价格进行排序。
  3. 组合选择

    • 使用双层循环,外层循环控制从含有蘑菇的菜中选择的数量,内层循环从不含蘑菇的菜中选择剩余的菜。
    • 计算每种组合的总价格,并更新最小值。
  4. 返回结果

    • 如果找到满足条件的组合,返回最小总价格;否则返回 -1

通过以上步骤,你应该能够逐步实现这个问题的解决方案。如果你有任何具体的问题或需要进一步的代码提示,请告诉我!


这里可以清楚地知道,这道题可以分别设置两个列表表示有蘑菇和无蘑菇的菜,接着用双层循环,计算每种组合的价格,更新最小值。
此时,问题的思路已经清晰,这个时候可以选择自己根据思路写,或者觉得难度依旧很大,那么我们可以让AI给我们一点代码提示。

AI代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static long solution(String s, int[] a, int m, int k) {
        // 分类和排序
        List<Integer> a1 = new ArrayList<>(); // 不含蘑菇的菜
        List<Integer> a2 = new ArrayList<>(); // 含有蘑菇的菜
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '0') {
                a1.add(a[i]);
            } else {
                a2.add(a[i]);
            }
        }
        Collections.sort(a1);
        Collections.sort(a2);

        // 边界情况
        if (s.length() < k) {
            return -1;
        }

        // 组合选择
        long total = Integer.MAX_VALUE;
        boolean flag = false;
        for (int i = 0; i <= m && i <= k && i <= a2.size(); i++) {
            long current = 0;
            // 选择含有蘑菇的菜
            for (int z = 0; z < i; z++) {
                current += a2.get(z);
            }
            // 选择不含蘑菇的菜
            if (k - i <= a1.size() && (k - i) >= 0) {
                for (int j = 0; j < k - i; j++) {
                    current += a1.get(j);
                }
                total = Math.min(total, current);
                flag = true;
            }
        }

        // 返回结果
        if (!flag) {
            return -1;
        }
        return total;
    }

    public static void main(String[] args) {
        System.out.println(solution("001", new int[] { 10, 20, 30 }, 1, 2) == 30);
        System.out.println(solution("111", new int[] { 10, 20, 30 }, 1, 2) == -1);
        System.out.println(solution("0101", new int[] { 5, 15, 10, 20 }, 2, 3) == 30);
    }
}

这个时候,我们运行,发现题目就通过了。是不是很完美,这个时候我们就需要仔细阅读代码逻辑,积累在自己的脑子里。

问题3:有了豆包,我们还需要看答案解析吗


AI的不足
  1. 并不能完美实现代码,部分难度较高的代码仍需要进行手动改进。比如一些难度比较高的迭代和动态规划,或者在一些边界处理上不能完美通过。
  2. 纠错能力差,比如我提出的错误,它即使肯定错误但还是会写重复的代码。这一点大家试一试就会发现。
  3. (后续补充……)