豆包MarsCode AI 刷题(代码练习)提升效率总结
MarsCode AI简述
引用官方的图
总而言之,豆包实际在算法练习中会出现在右边侧栏。如图:
问题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内容
好的,让我们来分析一下这个问题,并提供一些解题思路。
问题理解
-
输入:
s
:一个字符串,表示每道菜是否含有蘑菇。a
:一个整数数组,表示每道菜的价格。m
:一个整数,表示小C最多能接受的含有蘑菇的菜的数量。k
:一个整数,表示小C希望点的菜的总数。
-
输出:
- 一个整数,表示在满足条件的情况下能选出的最小总价格。如果无法按照要求选择菜品,则输出
-1
。
- 一个整数,表示在满足条件的情况下能选出的最小总价格。如果无法按照要求选择菜品,则输出
解题思路
-
数据结构选择:
- 我们可以将每道菜的信息(价格和是否含有蘑菇)存储在一个列表中,方便后续处理。
-
算法步骤:
-
分类:将所有菜分为两类:含有蘑菇的菜和不含有蘑菇的菜。
-
排序:对这两类菜分别按价格进行升序排序。
-
组合选择:
- 尝试从含有蘑菇的菜中选择
0
到m
道菜,剩下的从不含蘑菇的菜中选择。 - 计算每种组合的总价格,并记录最小值。
- 尝试从含有蘑菇的菜中选择
-
边界情况:
- 如果总的菜数不足
k
,直接返回-1
。 - 如果含有蘑菇的菜数不足
m
,则只能从不含蘑菇的菜中选择。
- 如果总的菜数不足
-
具体步骤
-
初始化:
- 创建两个列表,分别存储含有蘑菇和不含有蘑菇的菜。
-
分类和排序:
- 遍历
s
和a
,将菜分类并存储到对应的列表中。 - 对两个列表分别按价格进行排序。
- 遍历
-
组合选择:
- 使用双层循环,外层循环控制从含有蘑菇的菜中选择的数量,内层循环从不含蘑菇的菜中选择剩余的菜。
- 计算每种组合的总价格,并更新最小值。
-
返回结果:
- 如果找到满足条件的组合,返回最小总价格;否则返回
-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的不足
- 并不能完美实现代码,部分难度较高的代码仍需要进行手动改进。比如一些难度比较高的迭代和动态规划,或者在一些边界处理上不能完美通过。
- 纠错能力差,比如我提出的错误,它即使肯定错误但还是会写重复的代码。这一点大家试一试就会发现。
- (后续补充……)