沃尔玛(Walmart Labs) 2025 技术电面全揭秘:DFS 与 BFS 攻克“课程表”经典图论真题

在最近的 2025 年秋招季中,沃尔玛(Walmart Labs)的电面轮次频频祭出图论算法这把“杀手锏”。作为硅谷一线大厂,Walmart Labs 非常看重候选人对基础数据结构与算法的扎实掌握程度。今天,我们将硬核拆解一道在 2025 年 9 月沃尔玛技术电面中真实出现的超高频面试题——LeetCode 207: Course Schedule(课程表),并分别使用深度优先搜索(DFS)和广度优先搜索(BFS)为你提供满分解答。

目录


1. 面试背景与题目解析

面试公司:Walmart Labs (沃尔玛实验室) 面试轮次:技术电面 (Phone Screen) 题目描述: 你总共需要上 numCourses 门课,课程编号依次为 0numCourses - 1。你会得到一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] 表示如果你想上课程 ai ,你必须先完成课程 bi 。 请判断你是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false

2. 核心考点剖析

这道题的本质是一个有向图的环检测问题。 课程之间的依赖关系构成了一个有向图:bi -> ai。如果在这个有向图中存在一个环,那么就意味着存在循环依赖(例如:想学A必须先学B,想学B又必须先学A),这就导致无法完成所有课程。如果图中无环,说明存在一个有效的拓扑排序,可以按顺序学完所有课程。

面试官明确要求分别使用 DFSBFS 两种方法来解答,这不仅考察你对图遍历算法的熟练度,更是对你思维广度的全方位检验。

3. 解决方案与 Python 代码实现

3.1 广度优先搜索 (BFS) - 拓扑排序

BFS 的核心思想是使用Kahn算法计算每个节点的入度(In-degree)。

  1. 统计每个课程的入度(需要的前置课程数量)并构建邻接表。
  2. 将所有入度为 0 的课程(没有任何先修要求的课程)加入队列。
  3. 不断从队列中取出课程,并将其所有后续课程的入度减 1。如果某个后续课程的入度减为 0,则将其加入队列。
  4. 记录弹出的节点总数,如果等于课程总数,说明无环,否则说明有环。
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!)

Previous
Previous

2026最新领英(LinkedIn)技术电面真题解析:巧妙寻找二叉树的第二小节点

Next
Next

2026 硅谷一线大厂(Meta/Circle)高频面经深度复盘:二叉树与高级排序算法的完美碰撞