Java拓扑排序知识点(含面试大厂题和源码)

在技术面试中,大厂可能会要求候选人实现或优化一些与图相关的算法,比如深度优先搜索(DFS)、广度优先搜索(BFS)和拓扑排序等。以下是三道与这些算法相关的面试题目,以及它们的Java源码示例。

1. 实现深度优先搜索(DFS)

题目:实现一个深度优先搜索算法,用于递归地遍历一个图的所有顶点。

源码

import java.util.ArrayList;
import java.util.List;public class DFSGraph {private final int V; // 顶点的数量private final List<List<Integer>> adj; // 邻接表public DFSGraph(int V) {this.V = V;adj = new ArrayList<>(V);for (int i = 0; i < V; i++) {adj.add(new ArrayList<>());}}public void addEdge(int source, int dest) {adj.get(source).add(dest);}public void DFS(int v) {boolean[] visited = new boolean[V];DFSUtil(v, visited);}private void DFSUtil(int v, boolean[] visited) {visited[v] = true;System.out.print(v + " ");for (int i : adj.get(v)) {if (!visited[i]) {DFSUtil(i, visited);}}}public static void main(String[] args) {DFSGraph graph = new DFSGraph(4);graph.addEdge(0, 1);graph.addEdge(1, 2);graph.addEdge(2, 3);graph.addEdge(3, 1);graph.DFS(0);}
}

2. 实现广度优先搜索(BFS)

题目:实现一个广度优先搜索算法,用于遍历一个图,并找到最短路径。

源码

import java.util.*;public class BFSGraph {private final int V; // 顶点的数量private final List<List<Integer>> adj; // 邻接表public BFSGraph(int V) {this.V = V;adj = new ArrayList<>(V);for (int i = 0; i < V; i++) {adj.add(new ArrayList<>());}}public void addEdge(int source, int dest) {adj.get(source).add(dest);}public void BFS(int s) {boolean[] visited = new boolean[V];Queue<Integer> queue = new LinkedList<>();visited[s] = true;queue.offer(s);while (!queue.isEmpty()) {int v = queue.poll();System.out.print(v + " ");for (Integer i : adj.get(v)) {if (!visited[i]) {visited[i] = true;queue.offer(i);}}}}public static void main(String[] args) {BFSGraph graph = new BFSGraph(4);graph.addEdge(0, 1);graph.addEdge(1, 2);graph.addEdge(2, 3);graph.addEdge(3, 1);graph.BFS(0);}
}

3. 检测图是否包含环

题目:给定一个图,使用DFS实现一个算法来检测图中是否存在环。

源码

import java.util.ArrayList;
import java.util.List;public class GraphCycleDetection {private final int V; // 顶点的数量private final List<List<Integer>> adj; // 邻接表private boolean[] visited;private boolean[] recStack;private boolean isCycle;public GraphCycleDetection(int V) {this.V = V;adj = new ArrayList<>(V);for (int i = 0; i < V; i++) {adj.add(new ArrayList<>());}}public void addEdge(int source, int dest) {adj.get(source).add(dest);}public boolean isGraphCyclic() {visited = new boolean[V];recStack = new boolean[V];isCycle = false;for (int i = 0; i < V; i++) {if (isCycle) break;if (!visited[i]) {detectCycle(i);}}return isCycle;}private void detectCycle(int v) {if (isCycle) return;visited[v] = true;recStack[v] = true;for (Integer neighbour : adj.get(v)) {if (!visited[neighbour] && detectCycle(neighbour)) {isCycle = true;return;} else if (recStack[neighbour]) {isCycle = true;return;}}recStack[v] = false;}public static void main(String[] args) {GraphCycleDetection graph = new GraphCycleDetection(4);graph.addEdge(0, 1);graph.addEdge(1, 2);graph.addEdge(2, 3);graph.addEdge(3, 1); // 此边创建环System.out.println("图中是否存在环: " + graph.isGraphCyclic());}
}

以上三道题目分别考察了DFS、BFS的实现以及如何使用DFS来检测图中的环。这些题目都是大厂面试中常见的题型,旨在考察候选人对图算法的理解和实现能力。在技术面试中,大厂可能会要求候选人实现或优化一些与图相关的算法,比如深度优先搜索(DFS)、广度优先搜索(BFS)和拓扑排序等。以下是三道与这些算法相关的面试题目,以及它们的Java源码示例。

1. 实现深度优先搜索(DFS)

题目:实现一个深度优先搜索算法,用于递归地遍历一个图的所有顶点。

源码

import java.util.ArrayList;
import java.util.List;public class DFSGraph {private final int V; // 顶点的数量private final List<List<Integer>> adj; // 邻接表public DFSGraph(int V) {this.V = V;adj = new ArrayList<>(V);for (int i = 0; i < V; i++) {adj.add(new ArrayList<>());}}public void addEdge(int source, int dest) {adj.get(source).add(dest);}public void DFS(int v) {boolean[] visited = new boolean[V];DFSUtil(v, visited);}private void DFSUtil(int v, boolean[] visited) {visited[v] = true;System.out.print(v + " ");for (int i : adj.get(v)) {if (!visited[i]) {DFSUtil(i, visited);}}}public static void main(String[] args) {DFSGraph graph = new DFSGraph(4);graph.addEdge(0, 1);graph.addEdge(1, 2);graph.addEdge(2, 3);graph.addEdge(3, 1);graph.DFS(0);}
}

2. 实现广度优先搜索(BFS)

题目:实现一个广度优先搜索算法,用于遍历一个图,并找到最短路径。

源码

import java.util.*;public class BFSGraph {private final int V; // 顶点的数量private final List<List<Integer>> adj; // 邻接表public BFSGraph(int V) {this.V = V;adj = new ArrayList<>(V);for (int i = 0; i < V; i++) {adj.add(new ArrayList<>());}}public void addEdge(int source, int dest) {adj.get(source).add(dest);}public void BFS(int s) {boolean[] visited = new boolean[V];Queue<Integer> queue = new LinkedList<>();visited[s] = true;queue.offer(s);while (!queue.isEmpty()) {int v = queue.poll();System.out.print(v + " ");for (Integer i : adj.get(v)) {if (!visited[i]) {visited[i] = true;queue.offer(i);}}}}public static void main(String[] args) {BFSGraph graph = new BFSGraph(4);graph.addEdge(0, 1);graph.addEdge(1, 2);graph.addEdge(2, 3);graph.addEdge(3, 1);graph.BFS(0);}
}

3. 检测图是否包含环

题目:给定一个图,使用DFS实现一个算法来检测图中是否存在环。

源码

import java.util.ArrayList;
import java.util.List;public class GraphCycleDetection {private final int V; // 顶点的数量private final List<List<Integer>> adj; // 邻接表private boolean[] visited;private boolean[] recStack;private boolean isCycle;public GraphCycleDetection(int V) {this.V = V;adj = new ArrayList<>(V);for (int i = 0; i < V; i++) {adj.add(new ArrayList<>());}}public void addEdge(int source, int dest) {adj.get(source).add(dest);}public boolean isGraphCyclic() {visited = new boolean[V];recStack = new boolean[V];isCycle = false;for (int i = 0; i < V; i++) {if (isCycle) break;if (!visited[i]) {detectCycle(i);}}return isCycle;}private void detectCycle(int v) {if (isCycle) return;visited[v] = true;recStack[v] = true;for (Integer neighbour : adj.get(v)) {if (!visited[neighbour] && detectCycle(neighbour)) {isCycle = true;return;} else if (recStack[neighbour]) {isCycle = true;return;}}recStack[v] = false;}public static void main(String[] args) {GraphCycleDetection graph = new GraphCycleDetection(4);graph.addEdge(0, 1);graph.addEdge(1, 2);graph.addEdge(2, 3);graph.addEdge(3, 1); // 此边创建环System.out.println("图中是否存在环: " + graph.isGraphCyclic());}
}

以上三道题目分别考察了DFS、BFS的实现以及如何使用DFS来检测图中的环。这些题目都是大厂面试中常见的题型,旨在考察候选人对图算法的理解和实现能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hdu3118 Arbiter【二进制枚举建二分图】

Arbiter 题意 给定 n n n 个点和 m m m 条边&#xff0c;要求删除最少数量的边&#xff0c;使图中没有奇环 n ≤ 15 , m ≤ 300 n \leq 15,m \leq 300 n≤15,m≤300 思路 没有奇环的图是二分图 我们可以直接从定义入手&#xff0c;用二进制枚举二分图的两个颜色的点&#…

(十六)call、apply、bind介绍、区别和实现

函数中的this指向&#xff1a; 函数中的this指向是在函数被调用的时候确定的&#xff0c;也就是执行上下文被创建时确定的。在一个执行上下文中&#xff0c;this由调用者提供&#xff0c;由调用函数的方式来决定。 类数组对象arguments&#xff1a; arguments只在函数&#…

谷歌收录工具有什么好用的?

如果是想促进谷歌的收录&#xff0c;其实能用的手段无非就两个&#xff0c;谷歌GSC以及爬虫池 谷歌gsc就不用说了&#xff0c;作为谷歌官方提供的工具&#xff0c;他能提供最准确的数据&#xff0c;并且可以提交每天更新的链接&#xff0c;进而促进收录&#xff0c;只要你的页面…

day18 java ​​​​​​​集合Collection的List和Set

Collection分成List和Set|------Collection|-------List : 存储的元素是有序的并且可以重复|--------ArrayList|--------LinkedList|--------Vector|-------Set : 存储的元素是无序的并且不可以重复|--------HashSet|--------LinkedHashSet|--------TreeSet List接口 List常…

java面向对象.day28(接口的定义与实现)

Java接口&#xff08;Interface&#xff09;是Java编程语言中的一个重要概念&#xff0c;它定义了一个类应该具备的方法&#xff0c;但不提供具体的实现。接口可以被看作是一种特殊的抽象类&#xff0c;其中所有的方法都是抽象的。一个类可以实现&#xff08;implements&#x…

模块三:二分——69.x的平方根

文章目录 题目描述算法原理解法一&#xff1a;暴力查找解法二&#xff1a;二分查找 代码实现暴力查找CJava 题目描述 题目链接&#xff1a;69.x的平方根 算法原理 解法一&#xff1a;暴力查找 依次枚举 [0, x] 之间的所有数 i &#xff08;这⾥没有必要研究是否枚举到 x /…

【后端】python2和python3的安装与配置

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、python是什么二、python环境的安装与配置Python 2的安装与配置Python 3的安装与配置注意事项 三、总结 前言 随着开发语言及人工智能工具的普及&#xff0…

洗地机哪个牌子好?推荐这四款热销品牌

随着科技的不断发展&#xff0c;洗地机已经成为了家庭中不可或缺的智能家居设备。它们能够帮助我们轻松地完成地面清洁工作&#xff0c;节省时间和精力。但是&#xff0c;面对市场上琳琅满目的洗地机品牌&#xff0c;我们该如何选择呢&#xff1f;本文将为大家介绍四大口碑洗地…

Jackson 2.x 系列【31】Spring Boot 集成之字典翻译

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 场景描述2. 案例演示2.1 修改枚举2.2 定义注解…

使用PlantUML绘制活动图、泳道图

最近在学PlantUML 太漂亮了 给大家欣赏一下 我也记录一下 startuml |使用前| start :用户打开旅游App; |#LightSkyBlue|使用后| :用户浏览旅游信息; |#AntiqueWhite|登机前| :用户办理登机手续; :系统生成登机牌; |使用前| :用户到达机场; |登机前| :用户通过安检; |#Light…

2024华中杯A题|太阳能路灯光伏板的朝向设计问题(思路、代码.....)

太阳能路灯由太阳能电池板组件部分(包括支架)、LED灯头、控制箱(包含控制器、蓄电池)、市电辅助器和灯杆几部分构成。太阳能电池板通过支架固定在灯杆上端。太阳能电池板也叫光伏板,它利用光伏效应接收太阳辐射能并转化为电能输出,经过充放电控制器储存在蓄电池中。太阳能…

使用vue3+ts+vite从零开始搭建bolg(三)(持续更新中)

三、axios&#xff0c;API和路由封装 3.1 axios二次封装 pnpm i axios在src下建立如图文件夹 在request下配置请求拦截器&#xff0c;响应拦截器 import axios from axios import { ElMessage } from element-pluslet request axios.create({baseURL: import.meta.env.VITE…

近场到远场转换的脚本实现(fdtd)

FDTD&#xff08;Finite Difference Time Domain&#xff09;是一种用于模拟电磁场行为的数值方法。在FDTD模拟中&#xff0c;近场通常指的是靠近源或观察点的区域&#xff0c;而远场通常指的是远离源或观察点的区域。实现近场到远场的转换&#xff0c;通常涉及到从模拟区域中提…

DFS与回溯专题:路径总和问题

DFS与回溯专题&#xff1a;路径总和问题 一、路径总和 题目链接&#xff1a; 112.路径总和 题目描述 代码思路 对二叉树进行dfs搜索&#xff0c;递归计算每条路径的节点值之和&#xff0c;当某个节点的左右子节点都为空时&#xff0c;说明已经搜索完成某一条路径&#xff0…

牛客NC195 二叉树的直径【simple DFS C++ / Java /Go/ PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/15f977cedc5a4ffa8f03a3433d18650d 思路 最长路径有两种情况&#xff1a; 1.最长条路径经过根节点&#xff0c;那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。 2.最长路径没有经过根节点&#xf…

js some对比forEach

some&#xff1a;return true可以停止循环 forEach&#xff1a;return true无法停止循环 <!DOCTYPE html> <html ng-app"my_app"><head><script type"text/javascript">const array [10, 20, 30];const targetValue 10;// 检测…

Vue3的监听属性watch和计算属性computed

监听属性watch 计算属性computed 一、监听属性watch watch 的第一个参数可以是不同形式的“数据源&#xff0c;watch 可以监听以下几种数据&#xff1a; 一个 ref (包括计算属性)、 一个响应式对象、 一个 getter 函数、 或多个数据源组成的数组 watch 的参数:监视的回调&…

企业数字化转型

企业数字化更多是业务数字化&#xff0c;是“信息化”的更新升级&#xff0c;和信息化有较大差别。 企业信息化专注于企业信息的记录&#xff0c;“无纸化办公”是其明显特征。企业信息化不改造业务&#xff0c;只是业务的计算机方式实现&#xff0c;不对企业内部流程或组织做…

Linux驱动开发——(四)内核定时器

一、内核的时间管理 1.1 节拍率 Linux内核中有大量的函数需要时间管理&#xff0c;比如周期性的调度程序、延时程序等等&#xff0c;对于驱动编写者来说最常用的是定时器。 硬件定时器提供时钟源&#xff0c;时钟源的频率可以设置&#xff0c;设置好以后就周期性的产生定时中…

C#:用 BigInteger 计算 斐波那契数列

using System.Numerics; 计算 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;不受长整型位数限制。 编写 fibonacci.cs 如下 // C# program for Fibonacci Series // using Dynamic Programming using System; using System.Numerics;class fibona…