沃尔玛(Walmart Labs) 2025 技术电面全揭秘:DFS 与 BFS 攻克“课程表”经典图论真题
在最近的 2025 年秋招季中,沃尔玛(Walmart Labs)的电面轮次频频祭出图论算法这把“杀手锏”。作为硅谷一线大厂,Walmart Labs 非常看重候选人对基础数据结构与算法的扎实掌握程度。今天,我们将硬核拆解一道在 2025 年 9 月沃尔玛技术电面中真实出现的超高频面试题——LeetCode 207: Course Schedule(课程表),并分别使用深度优先搜索(DFS)和广度优先搜索(BFS)为你提供满分解答。
目录
- 1. 面试背景与题目解析
- 2. 核心考点剖析
- 3. 解决方案与 Python 代码实现
- 3.1 广度优先搜索 (BFS) - 拓扑排序
- 3.2 深度优先搜索 (DFS) - 环检测
- 4. 2026 沃尔玛 Offer 真实案例分享
- 5. 硅谷专家“面试救急”服务
1. 面试背景与题目解析
面试公司:Walmart Labs (沃尔玛实验室)
面试轮次:技术电面 (Phone Screen)
题目描述:
你总共需要上 numCourses 门课,课程编号依次为 0 到 numCourses - 1。你会得到一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] 表示如果你想上课程 ai ,你必须先完成课程 bi 。
请判断你是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。
2. 核心考点剖析
这道题的本质是一个有向图的环检测问题。
课程之间的依赖关系构成了一个有向图:bi -> ai。如果在这个有向图中存在一个环,那么就意味着存在循环依赖(例如:想学A必须先学B,想学B又必须先学A),这就导致无法完成所有课程。如果图中无环,说明存在一个有效的拓扑排序,可以按顺序学完所有课程。
面试官明确要求分别使用 DFS 和 BFS 两种方法来解答,这不仅考察你对图遍历算法的熟练度,更是对你思维广度的全方位检验。
3. 解决方案与 Python 代码实现
3.1 广度优先搜索 (BFS) - 拓扑排序
BFS 的核心思想是使用Kahn算法计算每个节点的入度(In-degree)。
- 统计每个课程的入度(需要的前置课程数量)并构建邻接表。
- 将所有入度为 0 的课程(没有任何先修要求的课程)加入队列。
- 不断从队列中取出课程,并将其所有后续课程的入度减 1。如果某个后续课程的入度减为 0,则将其加入队列。
- 记录弹出的节点总数,如果等于课程总数,说明无环,否则说明有环。
from collections import deque
def canFinish_bfs(numCourses: int, prerequisites: list[list[int]]) -> bool:
# 初始化入度数组和邻接表
indegree = [0] * numCourses
adj = [[] for _ in range(numCourses)]
# 构建图:src -> dest
for dest, src in prerequisites:
adj[src].append(dest)
indegree[dest] += 1
# 将所有入度为0的节点入队
queue = deque([i for i in range(numCourses) if indegree[i] == 0])
completed_courses = 0
while queue:
node = queue.popleft()
completed_courses += 1
# 遍历当前节点的所有邻居节点
for neighbor in adj[node]:
indegree[neighbor] -= 1
# 如果邻居节点的入度变为0,说明前置课程已全部修完,可以入队
if indegree[neighbor] == 0:
queue.append(neighbor)
# 如果修完的课程等于总课程数,说明没有环
return completed_courses == numCourses
3.2 深度优先搜索 (DFS) - 环检测
DFS 的核心思想是通过节点的状态标记来寻找是否有向后退回的边(Back Edge)。 我们为每个节点定义三种状态:
0:未访问 (Unvisited)1:正在访问中 (Visiting) —— 如果在 DFS 过程中再次遇到状态为 1 的节点,说明存在环!2:已完成访问 (Visited) —— 当前节点及其所有路径均已安全检查完毕,无环。
def canFinish_dfs(numCourses: int, prerequisites: list[list[int]]) -> bool:
# 构建邻接表
adj = [[] for _ in range(numCourses)]
for dest, src in prerequisites:
adj[src].append(dest)
# 状态数组:0=未访问, 1=访问中, 2=已完成
visited = [0] * numCourses
def has_cycle(node: int) -> bool:
if visited[node] == 1:
return True # 发现环
if visited[node] == 2:
return False # 已经验证过无环
# 标记为正在访问
visited[node] = 1
for neighbor in adj[node]:
if has_cycle(neighbor):
return True
# 标记为安全/已完成
visited[node] = 2
return False
# 需要检查每个节点,因为图可能是不连通的
for i in range(numCourses):
if visited[i] == 0:
if has_cycle(i):
return False
return True
4. 2026 沃尔玛 Offer 真实案例分享
2026 年 2 月,正在面临春招巨大压力的学员王同学(转码背景),在屡屡受挫后联系到了我们。王同学由于缺乏企业级面试经验,在面对图论、动态规划等硬核算法时经常在白板环节大脑空白。
通过我们的定制化面试培训与面试准备方案,我们为王同学制定了为期 3 周的魔鬼训练。针对 Walmart Labs 的偏好,我们的硅谷资深导师带他重点突击了高频数据结构,并利用系统化的策略教他如何与面试官沟通思路(如在本次 Course Schedule 题中主动提出 DFS 和 BFS 两种方案及其时间复杂度差异)。
在最终的电面中,王同学不仅不到 20 分钟就手写出双解法,更是应对自如地回答了关于系统并发调度的 follow-up 问题。最终在面试结束后的第二天,顺利斩获 Walmart Labs SDE II 的高薪 Offer!成功上岸!
5. 硅谷专家“面试救急”服务
在当下极其内卷的科技寒冬,找工作绝不仅仅是刷几道算法题那么简单。无论是简历被简历解析系统(ATS)疯狂过滤,还是在终面环节因为 System Design 卡壳而痛失良机,你需要的不是盲目的努力,而是真正懂行的人拉你一把!
我们提供来自硅谷一线大厂的高级工程师组成的专业团队,为您提供全方位的求职护航服务:
- 面试准备与精准突击:从简历精修到精准题库,杜绝无效刷题。
- 企业级面试培训:真实还原大厂压迫感面试环境,系统设计把脉指导。
- 私密级面试辅助服务:高难度技术面遇到瓶颈?提供绝对安全、隐私的面试代面、面试枪手、面试代考及远程系统设置服务,助你在核心技术面中无损通关。
不要让一次失误毁了你半年的努力。专业的事情交给专业的人!
🚀 点击这里立即预约 1v1 免费求职评估! 🚀 (档期有限,先到先得,让我们在最艰难的求职季助你拿到心仪的 Offer!)