1. 前言
最初使用Marscode,刚好正在进行人生第一次算法实习,作为一个非科班、一年前连“hello world”都不会写的交叉专业学生,虽然狂补了很多编程、ai方面的知识,但是在实际项目中还是会碰到各种问题。虽然可以将代码复制到gpt、质谱等大模型里进行提问,但是一方面来回复制操作非常麻烦,时间消耗也不小;另一方面这些大模型毕竟都是通用大模型,对于专业编程问题的回答总感觉差了点意思。
刚好此时接触到Marscode,用下来感觉着实不错,有vscode插件,使用较为方便,代码解释也较为合理,可以自动扩展编程。而在青训营期间,通过刷题也提升了Marscode的使用经验,在此分享一下使用中发现的一些技巧。
附加一下青训营刷题链接:sourl.co/jmJj3i
2. 回答质量影响因素
对于不同的题目,Marscode回答的质量差别是非常大的,主要影响因素有以下几方面:
1.题目难度
简单难度回答正确的概率非常高,很多简单题让Marscode,出来的结果直接就可以正确提交。中等难度很少能直接答对,需要找出回答中的错漏,让Marscode修复。困难难度则基本不可能直接回答正确,而且不少题目哪怕提出问题,修复后的结果也不对,需要采用半人工、半ai的方式,手写一部分代码,让Marscode修改、补全。
2.题目类型
青训营里面的题目工共分为13类,个人用下来感觉,Marscode比较容易回答的有:数学、双指针、传智杯、模拟、二分查找、其他,回答效果一般的有:哈希表、贪心、位运算、队列、动态规划,回答效果较差的有栈、图论。
3.提问方法
不同的提问方法效果也有差别。如果直接点击默认的“给我一些代码提示”,那回答出来的答案多半是有问题的。如果对题目有一定的分析,告诉Marscode这道题的解题思路、回答步骤,那么正确率会提高不少。
3. 使用方法
对于大部分题目,我一般使用以下方法:
1. 第一步:默认提问
Marscode有三个默认提问:1.需要一点思路提示、2.给我一些代码提示、3.帮我检查一下代码。拿到一个问题,不管什么难度,直接点第二个,会快速给你一个答案。比如第17题,小M的数组变换,会给出以下结果:
嗯,这个答案点击运行,不出意外的报错了:
2.第二步:纠错
这一步有两种方法:
- 默认fix
如图位置,有一个ai fix修复方式,点击以后会给出一个修复后的答案,前面部分相同,后面根据问题增加了修正代码:
这种方法有一定概率过,但是不幸的是,这次没有。。。
- 默认提问:帮我检查一下代码
点击新建对话,选择第三个默认选项:帮我检查一下代码,这次出现了一个新结果,然而,试下来,结果依旧不行。
3. 第三步:重新提问
基本可以判断,之前的代码想要通过修复的方式是不可能答对了,那就要换个思路重新提问。这一步重置代码,返回默认提问,让大模型给出一个解题思路:
解题思路
素因子分解:
首先,我们需要对数组中的每个元素进行素因子分解。素因子分解是将一个数分解为它的素数因子的乘积。例如,12 可以分解为 2 * 2 * 3。
素因子集合:
对于每个元素,我们可以得到它的素因子集合。例如,12 的素因子集合是 {2, 3}。
素因子图:
我们可以构建一个图,其中每个节点代表一个素因子,如果两个素因子出现在同一个元素的素因子集合中,则在它们之间建立一条边。
连通性检查:
如果这个图是连通的,那么我们可以通过题目中的操作将所有元素“简化”到它们的素因子形式。如果图不连通,则说明有些素因子无法通过操作相互转换,因此无法满足题目要求。
判断结果:
如果图是连通的,输出 "Yes";否则输出 "No"。
数据结构选择
素因子分解:可以使用质数筛法或其他素数分解算法。
素因子集合:可以使用集合(set)来存储每个元素的素因子。
素因子图:可以使用邻接表或邻接矩阵来表示图。
算法步骤
对数组中的每个元素进行素因子分解,得到每个元素的素因子集合。
构建素因子图,将出现在同一个元素中的素因子之间建立边。
使用图的连通性算法(如深度优先搜索或广度优先搜索)检查图是否连通。
根据连通性结果输出 "Yes" 或 "No"。
通过这些步骤,我们可以判断是否可以通过有限次操作使得数组中的每个元素最多只包含一种素因子。
接下来的步骤就非常关键了,追加提问:使用该思路,编写代码
Marscode会根据以上思路,给出一个新方案:
def solution(n: int, a: list) -> str:
from collections import defaultdict
import math
# 辅助函数:计算一个数的所有素因子
def prime_factors(num):
factors = set()
# 从2开始,逐个检查是否为因子
for i in range(2, int(math.sqrt(num)) + 1):
while num % i == 0:
factors.add(i)
num //= i
if num > 1:
factors.add(num)
return factors
# 1. 对每个元素进行素因子分解,得到每个元素的素因子集合
factor_sets = [prime_factors(num) for num in a]
# 2. 合并所有元素的素因子集合,得到一个总的素因子集合
total_factors = set()
for factors in factor_sets:
total_factors.update(factors)
# 3. 判断是否可以将总的素因子集合中的每个素因子分配到数组中的某个元素
# 这里的关键是检查每个素因子是否可以被分配到一个元素中
# 如果总的素因子集合的大小不超过数组的大小,则可以分配
if len(total_factors) <= n:
return "Yes"
else:
return "No"
if __name__ == '__main__':
print(solution(4, [1, 2, 3, 4]) == "Yes")
print(solution(2, [10, 12]) == "No")
print(solution(3, [6, 9, 15]) == "Yes")
初步分析一下,没什么问题。运行下来都是True,提交,果然答对了。
使用上述方法,尤其是第三步,大部分简单、中等难度的题目都可以回答,当然,如果这种情况还回答错误,就需要人工提供正确思路,让模型生成代码。