哔哩哔哩笔试 哔哩哔哩秋招 bilibili笔试 0915
笔试时间:2025年9月15日
往年笔试合集:
第一题:前置课程
为了毕业你需要选择n门课程,这n门课程中存在一定的依赖关系,例如想要完成B课程,必须先完成A课程。请你找出一个可以完成全部课程的顺序,如果无论如何选择都无法完成全部课程则返回空数组。
依赖关系以如下方式输入:[[2,1],[3,2]]。即要完成课程2,必须先完成1,要完成课程3,必须先完成课程2。答案[1,2,3]即可。但也可能出现类似[[2,1],[1,2]],要完成课程2,必须先完成1,要完成课程1,必须先完成课程2,则无解,返回一个空数组即可。
数据范围:1≤n<2000,依赖关系的数量满足0≤m≤n*(n-1),保证不会有一组一模一样的依赖关系。
输入描述
依赖关系数组和课程总数
输出描述
可以完成所有课程的顺序数组,如果无法完成则返回空数组
样例输入
[[1,0],[2,1]]
样例输出
[0,1,2]
参考题解
解题思路:
本题是经典的拓扑排序问题。将课程依赖关系建模为有向图,使用Kahn算法:
- 构建邻接表表示依赖关系,统计每门课程的入度
- 将入度为0的课程加入队列
- 依次处理队列中的课程,将其加入结果数组,并减少其后继课程的入度
- 若后继课程入度变为0则加入队列
- 最终若结果数组长度等于课程总数,说明无环可完成所有课程;否则返回空数组
C++:
#include <vector> #include <queue> using namespace std; class Solution { public: vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) { // 构建邻接表 vector<vector<int>> graph(numCourses); vector<int> inDegree(numCourses, 0); for (auto& prerequisite : prerequisites) { int course = prerequisite[0]; int preCourse = prerequisite[1]; graph[preCourse].push_back(course); inDegree[course]++; } // 队列存储入度为0的节点 queue<int> q; for (int i = 0; i < numCourses; i++) { if (inDegree[i] == 0) { q.push(i); } } vector<int> result; while (!q.empty()) { int currCourse = q.front(); q.pop(); result.push_back(currCourse); for (int nextCourse : graph[currCourse]) { inDegree[nextCourse]--; if (inDegree[nextCourse] == 0) { q.push(nextCourse); } } } return result.size() == numCourses ? result : vector<int>(); } };
Java:
import java.util.*; public class CourseSchedule { public int[] findOrder(int numCourses, int[][] prerequisites) { // 构建邻接表表示图 List<List<Integer>> graph = new ArrayList<>(); for (int i = 0; i < numCourses; i++) { graph.add(new ArrayList<>()); } // 入度数组 int[] inDegree = new int[numCourses]; for (int[] prerequisite : prerequisites) { int course = prerequisite[0]; int preCourse = prerequisite[1]; graph.get(preCourse).add(course); inDegree[course]++; } // 队列,用于存储入度为 0 的节点 Queue<Integer> queue = new LinkedList<>(); for (int i = 0; i < numCourses; i++) { if (inDegree[i] == 0) { queue.offer(i); } } int[] result = new int[numCourses]; int index = 0; while (!queue.isEmpty()) { int currCourse = qu
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025 春招笔试合集 文章被收录于专栏
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南