学习方法与心得| 豆包MarsCode AI刷题

164 阅读9分钟

方法与心得

在编程学习的过程中,借助像豆包 MarsCode AI 刷题这样的工具,能够让我们的学习效率和知识掌握程度得到极大提升。以下是我基于使用该刷题功能过程中的一些学习方法与心得分享,希望能给其他编程学习者带来帮助。

题目解析

思路 以这道关于小 C 和领导小 F 计划飞行的题目为例,我们的核心目标是求出最小起飞次数,关键在于如何依据给定的机场和航空公司关系规则来构建合理的飞行路线。 首先,要理解题目中所描述的飞行限制条件,即飞机只能飞往当前机场的相邻机场或相同航空公司管理的机场。基于此,我们可以想到利用图这种数据结构来表示机场之间的关系,每个航空公司旗下的机场构成一个连通的子图。 然后,采用广度优先搜索(BFS)算法来遍历这个图,从起点机场开始,逐步探索可达的机场,记录下每次移动所需要的起飞次数,直到抵达终点机场为止。BFS 能够保证我们按照距离起点由近及远的顺序去搜索,这样找到的第一条到达终点的路径对应的起飞次数就是最小的。

简解

想象把每个机场看作是图中的节点,如果两个机场是相邻的,就在它们之间连一条边;同时,如果两个机场属于同一家航空公司,也连一条边(哪怕它们在数组中的位置不相邻)。例如对于输入 airports = [10, 12, 13, 12, 14] ,可以画出这样一个简易的图: - 节点分别是 0 到 4(对应数组索引),每个节点标记上其所属的航空公司编号(也就是数组中对应的值)。 - 节点 0 与节点 1 有边相连(因为相邻),节点 0 与节点 3 也有边相连(因为同属航空公司 10);节点 1 与节点 2、节点 3 有边(相邻关系和同航空公司关系)等等。 通过这样的图结构,我们可以更直观地看到从起点到终点的可能路径,也能更好地理解 BFS 算法在这个图上是如何一步步搜索前进,去寻找最短路径(也就是最小起飞次数对应的路径)的。

代码详解

  • graph = defaultdict(list):这行代码创建了一个默认值为列表的字典,用于存储每个航空公司管理的所有机场。例如,航空公司 10 对应的列表里就会存放所有值为 10 的机场索引,方便后续查找同航空公司的机场。
  • for index, airline in enumerate(airports): graph[airline].append(index):通过循环遍历机场数组,将每个机场按照其所属航空公司分类添加到对应的列表中,完善了前面创建的图结构。
  • queue = deque([(0, 0)])visited = set([0]):分别初始化了用于 BFS 的队列和已访问机场的集合,队列中存放的是元组,包含当前机场的位置和对应的起飞次数,一开始从起点(位置 0)出发,起飞次数为 0。
  • while queue: 循环里:
  • position, takeoffs = queue.popleft():每次取出队列头部的元素,获取当前所在的机场位置和已经经历的起飞次数。
  • if position == len(airports) - 1: 这个判断用于检查是否到达了终点,如果到达就返回当前的起飞次数,意味着找到了最小起飞次数的路径。
  • 接下来的三个 if 语句分别处理三种不同的移动情况:
  • if position + 1 < len(airports) and (position + 1) not in visited: 是考虑向前移动一步到相邻机场,若该机场未被访问过,就将其标记为已访问,并加入队列,同时起飞次数加 1。
  • if position - 1 >= 0 and (position - 1) not in visited: 则是处理向后移动一步到相邻机场的情况,同样遵循未访问过才加入队列并更新相关状态的原则。
  • for same_airline_airport in graph[airports[position]]: 这个循环用于遍历当前机场所属航空公司的其他机场,如果这些机场还没被访问过,就将它们加入队列,并且起飞次数加 1,这样就实现了在同航空公司机场间的转移。

知识总结

新知识点梳理

图数据结构与应用:通过这道题,更深入地理解了图在实际问题中的构建方式,明白了如何根据具体的规则和条件把现实场景抽象成图的节点和边的关系,比如根据机场的相邻和同航空公司关系构建图。

广度优先搜索算法(BFS)优化:以往对 BFS 的运用可能比较常规,在本题中学会了如何结合具体的问题场景去巧妙运用 BFS,尤其是在处理多种移动规则(相邻和同航空公司关联移动)时,怎样合理地将不同情况融入到 BFS 的搜索过程中,同时还要注意避免重复访问节点以提高搜索效率。

defaultdict 的使用:之前虽然知道字典这种数据结构,但 defaultdict 这种可以自动处理键不存在时设置默认值为特定类型(本题中为列表)的用法,让代码在处理一些需要动态添加元素到某个分类下的情况时变得更加简洁高效。

理解与学习建议

对于图数据结构,建议入门同学多结合实际例子去理解,像这道飞行题目一样,把各种元素想象成图中的节点,根据它们之间的关联去画一画简单的图,直观感受图是如何表示复杂关系的。在学习 BFS 算法时,一定要亲手去写代码实现不同场景下的 BFS,比如简单的迷宫寻路、层级关系遍历等,通过实际操作来掌握其核心思想和实现细节,以及如何处理边界情况和优化搜索过程。而对于 defaultdict ,可以多做一些小练习,模拟不同的数据分类和存储需求,体会它相较于普通字典的便利性。

学习计划

制定刷题计划

分阶段目标设定

根据自己当前的编程水平和对知识点的掌握程度,将刷题过程分为不同阶段。比如,初级阶段先集中练习像本题涉及到的基础数据结构(如字典、列表)运用和简单算法(如 BFS 的基础实现)的题目,确保对这些核心知识有扎实的理解和熟练的代码书写能力;中级阶段可以选择一些融合多种数据结构和算法,并且有更复杂条件限制的题目,像在图上增加不同权重或者多种搜索规则混合的情况;高级阶段则挑战那些结合实际大型项目场景,需要优化算法性能、考虑极端情况的难题。

时间安排

制定每日或每周的刷题时间量,保持学习的连贯性。例如,每天抽出至少一个小时专门用于刷题,每周末花两到三个小时对本周刷题情况进行总结回顾,整理错题以及新学到的知识点。 ### 利用错题进行针对性学习

错题分析

每次刷题结束后,仔细分析做错的题目,不仅仅是找出代码中的语法错误,更要深入思考是哪个知识点没掌握好导致思路出错,或者是算法运用不熟练、对题目条件理解偏差等原因造成的。比如在这道飞行题目中,如果错了,要分析是图的构建不正确,还是 BFS 过程中对节点访问和队列操作有问题等。

专项巩固

针对错题所暴露的薄弱知识点,进行专项的复习和强化练习。可以通过豆包 MarsCode AI 刷题功能筛选出同类型或者涉及相关知识点的题目,集中攻克,加深对该知识点的理解和运用能力,确保下次遇到类似题目不会再犯错。

工具运用

与其他学习资源结合

搭配编程书籍

在使用豆包 MarsCode AI 刷题功能的同时,可以参考一些经典的编程书籍,比如讲解数据结构与算法的《算法导论》《数据结构与算法分析》等。当刷题遇到某个知识点不清楚时,从书籍中查找详细的理论讲解,加深对原理的理解;而通过刷题又能更好地将书中的理论知识应用到实际代码中,达到相辅相成的效果。

结合线上课程学习

报名一些优质的线上编程课程,课程中老师会系统地讲解编程知识体系以及解题思路和技巧。在学习课程后,利用 AI 刷题功能来进行实践巩固,检验自己对课程内容的掌握程度,同时把刷题过程中遇到的问题反馈到课程学习中,有针对性地向老师请教或者查看课程回放,进一步提升学习效果。

参与编程社区交流

加入编程相关的论坛、社区(如 Stack Overflow、GitHub 社区等),在刷题时如果遇到难题或者有独特的解题思路,可以在社区里分享交流,看看其他开发者的想法和建议。同时,也能从别人分享的案例和经验中学习到更多实用的编程技巧和知识,拓宽自己的学习视野,再将这些收获运用到 AI 刷题的实践中去。 总之,合理运用豆包 MarsCode AI 刷题功能,并与其他学习资源有机结合,制定科学的学习计划,善于总结知识和分析错题,能够让我们在编程学习的道路上事半功倍,不断提升自己的编程能力和解决实际问题的水平。希望这些方法和心得能助力更多编程爱好者在学习之路上取得进步。