Java强连通分量知识点(含面试大厂题和源码)

在大厂面试中,与拓扑排序相关的问题通常涉及到对图的处理和算法设计。以下是三道可能出现在大厂面试中的编程题目,以及相应的Java源码实现。

题目 1:课程依赖关系

描述
给定一个课程列表和课程之间的依赖关系,为所有课程安排一个上课时间表。每个课程都有一个先修课程列表,如果课程 A 依赖于课程 B,则 B 必须在 A 之前上课。返回一个按时间顺序排列的课程列表,如果无法安排,则返回空列表。

示例

输入: [["a", "b"], ["b", "c"], ["a", "c"]]
输出: ["a", "b", "c"]

Java 源码

import java.util.*;public class CourseSchedule {private Map<String, List<String>> graph;private Set<String> visited;private List<String> order;public List<String> findOrder(String[] courses) {graph = new HashMap<>();visited = new HashSet<>();order = new ArrayList<>();for (String course : courses) {String[] coursePair = course.split(", ");if (!graph.containsKey(coursePair[1])) {graph.put(coursePair[1], new ArrayList<>());}graph.get(coursePair[1]).add(coursePair[0]);}for (String course : graph.keySet()) {if (!visited.contains(course)) {dfs(course);}}return order.isEmpty() ? new ArrayList<>() : order;}private void dfs(String course) {visited.add(course);for (String preCourse : graph.get(course)) {if (!visited.contains(preCourse)) {dfs(preCourse);}}order.add(0, course); // 逆序添加到列表中以保持拓扑顺序}public static void main(String[] args) {CourseSchedule solution = new CourseSchedule();String[] courses = {"a, b", "b, c", "a, c"};List<String> result = solution.findOrder(courses);System.out.println("Course order: " + result);}
}

题目 2:项目任务调度

描述
给定一个项目任务列表和任务之间的依赖关系,每个任务都有一个唯一的标识符和一个任务完成时间。如果任务 A 依赖于任务 B,则 B 必须在 A 之前完成。返回一个按完成时间顺序排列的任务列表,如果无法调度,则返回空列表。

示例

输入: tasks = ["a(2)", "b(1)", "c(5)", "d(3)", "e(2)"], dependencies = ["a(b)", "e(c)"]
输出: ["b", "e", "a", "d", "c"]

Java 源码

import java.util.*;public class TaskScheduler {private Map<String, Integer> taskTime;private Map<String, List<String>> dependencies;private Queue<String> queue;public List<String> scheduleTasks(String[] tasks, String[] dependencies) {taskTime = new HashMap<>();for (String task : tasks) {String[] parts = task.split("\\(");taskTime.put(parts[0], Integer.parseInt(parts[1]));}this.dependencies = new HashMap<>();for (String dep : dependencies) {String[] parts = dep.split("(?=\\()");this.dependencies.put(parts[0], parts[1]);}queue = new LinkedList<>();for (String task : taskTime.keySet()) {if (!dependencies.containsKey(task)) {queue.add(task);}}while (!queue.isEmpty()) {String task = queue.poll();if (taskTime.containsKey(task)) {for (String nextTask : taskTime.keySet()) {if (dependencies.get(nextTask).equals(task)) {taskTime.remove(nextTask);if (taskTime.size() == 1) {return Arrays.asList(task);}for (String t : taskTime.keySet()) {if (!queue.contains(t)) {queue.add(t);}}}}}}return Collections.emptyList();}public static void main(String[] args) {TaskScheduler solution = new TaskScheduler();String[] tasks = {"a(2)", "b(1)", "c(5)", "d(3)", "e(2)"};String[] dependencies = {"a(b)", "e(c)"};List<String> result = solution.scheduleTasks(tasks, dependencies);System.out.println("Task order: " + result);}
}

题目 3:活动选择问题

描述
给定一系列活动和它们的开始时间及结束时间,选择最大的活动集合,其中活动之间不会相互重叠。每次选择一个活动时,都必须在开始时间早于结束时间的前提下,选择结束时间最早的活动。

示例

输入: [[1, 2], [3, 4], [2, 6]]
输出: [2, 3] 或 [3, 4]

Java 源码

import java.util.*;public class ActivitySelection {public int[][] maxActivities(int[][]活动时间) {Arrays.sort(活动时间, (a, b) -> a[1] - b[1]); // 按结束时间排序int n =活动时间.length;int[] dp = new int[n];int[] prev = new int[n];int count = 1;dp[0] = 1;prev[0] = -1;for (int i = 1; i < n; i++) {if (活动时间[i][0] >= dp[i - 1]) {// 如果当前活动的开始时间大于等于上一个活动的结束时间,则选择dp[i] = dp[i - 1] + 1;prev[i] = i - 1;} else {dp[i] = dp[i - 1];prev[i] = prev[i - 1];}if (dp[i] > count) {count = dp[i];}}int[] result = new int[count];for (int i = 0; i < count; i++) {result[i] =活动时间[prev[n - 1 - i]][0];}return new int[][]{{result[0], dp[n - 1]}, {活动时间[prev[n - 1]][0], dp[n - 1]}};}public static void main(String[] args) {ActivitySelection solution = new ActivitySelection();int[][] 活动时间 = {{1, 2}, {3, 4}, {2, 6}};int[][] result = solution.maxActivities(活动时间);System.out.println("Max activities: " + Arrays.deepToString(result));}
}

这些题目和源码展示了拓扑排序在解决实际问题中的应用。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!在大厂面试中,与强连通分量(SCC)相关的问题通常涉及到图论和算法设计。以下是三道可能出现在大厂面试中的编程题目,以及相应的Java源码实现。

题目 1:课程完成顺序

描述
给定一个课程之间的先修课程列表,每个课程都有一个先修课程和对应的课程编号。如果学生要完成所有课程,确定一个课程完成的顺序。如果不可能完成所有课程,则返回空列表。

示例

输入: [["a", "b"], ["c", "d"], ["b", "c"], ["d", "a"]]
输出: ["d", "c", "b", "a"] 或其他有效的顺序

Java 源码

import java.util.*;public class CourseCompletionOrder {private Map<String, List<String>> prerequisites;private Set<String> visited;private List<String> order;public List<String> findOrder(String[] courses, String[][] prerequisites) {this.prerequisites = new HashMap<>();this.visited = new HashSet<>();this.order = new ArrayList<>();for (String[] course : prerequisites) {this.prerequisites.put(course[1], new ArrayList<>());}for (String[] course : prerequisites) {this.prerequisites.get(course[1]).add(course[0]);}for (String course : courses) {if (!visited.contains(course)) {dfs(course);}}return order.isEmpty() ? Collections.emptyList() : order;}private void dfs(String course) {visited.add(course);for (String preCourse : prerequisites.get(course)) {if (!visited.contains(preCourse)) {dfs(preCourse);}}order.add(0, course); // 逆序添加到列表中以保持完成顺序}public static void main(String[] args) {CourseCompletionOrder solution = new CourseCompletionOrder();String[] courses = {"a", "b", "c", "d"};String[][] prerequisites = {{"a", "b"}, {"c", "d"}, {"b", "c"}, {"d", "a"}};List<String> result = solution.findOrder(courses, prerequisites);System.out.println("Course completion order: " + result);}
}

题目 2:社交网络中的强关系

描述
给定一个社交网络的联系列表,每个用户都有一个或多个朋友。定义一个强关系为如果 A 是 B 的朋友,B 也是 A 的朋友。找出社交网络中的所有强关系组。

示例

输入: friendships = [["alice", "bob"], ["bob", "carol"], ["alice", "carol"]]
输出: [["alice", "bob", "carol"]]

Java 源码

import java.util.*;public class StrongRelationships {private Map<String, List<String>> friendships;public List<List<String>> findStrongRelationships(String[][] friendships) {this.friendships = new HashMap<>();for (String[] friendship : friendships) {if (!this.friendships.containsKey(friendship[0])) {this.friendships.put(friendship[0], new ArrayList<>());}this.friendships.get(friendship[0]).add(friendship[1]);if (!this.friendships.containsKey(friendship[1])) {this.friendships.put(friendship[1], new ArrayList<>());}this.friendships.get(friendship[1]).add(friendship[0]);}List<List<String>> strongRelationships = new ArrayList<>();for (List<String> group : friendships.values()) {if (group.size() > 1) {strongRelationships.add(new ArrayList<>(group));}}return strongRelationships;}public static void main(String[] args) {StrongRelationships solution = new StrongRelationships();String[][] friendships = {{"alice", "bob"}, {"bob", "carol"}, {"alice", "carol"}};List<List<String>> result = solution.findStrongRelationships(friendships);System.out.println("Strong relationships: " + result);}
}

题目 3:网络中的强连通区域

描述
给定一个网络的连接列表,网络中的每个节点都可能存在多个连接。找出网络中的所有强连通区域。

示例

输入: connections = [[1, 2], [2, 3], [3, 1], [4, 5]]
输出: [[1, 2, 3], [4, 5]]

Java 源码

import java.util.*;public class StronglyConnectedRegions {private class Node {int value;List<Node> neighbors;public Node(int value) {this.value = value;this.neighbors = new ArrayList<>();}}public List<List<Integer>> findStronglyConnectedRegions(int[][] connections) {Map<Integer, Node> nodes = new HashMap<>();List<List<Integer>> regions = new ArrayList<>();for (int[] connection : connections) {Node u = nodes.getOrDefault(connection[0], new Node(connection[0]));Node v = nodes.getOrDefault(connection[1], new Node(connection[1]));u.neighbors.add(v);nodes.put(u.value, u);nodes.put(v.value, v);}Set<Integer> visited = new HashSet<>();for (Node node : nodes.values()) {if (!visited.contains(node.value)) {dfs(node, regions);}}return regions;}private void dfs(Node node, List<List<Integer>> regions) {visited.add(node.value);List<Integer> region = new ArrayList<>();region.add(node.value);for (Node neighbor : node.neighbors) {if (!visited.contains(neighbor.value)) {dfs(neighbor, regions);}}if (!region.isEmpty()) {regions.add(region);}}public static void main(String[] args) {StronglyConnectedRegions solution = new StronglyConnectedRegions();int[][] connections = {{1, 2}, {2, 3}, {3, 1}, {4, 5}};List<List<Integer>> result = solution.findStronglyConnectedRegions(connections);System.out.println("Strongly connected regions: " + result);}
}

这些题目和源码展示了强连通分量在不同场景下的应用。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!

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

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

相关文章

Bigtable [OSDI‘06] 论文阅读笔记

原论文&#xff1a;Bigtable: A Distributed Storage System for Structured Data (OSDI’06) 1. Introduction Bigtable 是一种用于管理结构化数据的分布式存储系统&#xff0c;可扩展到非常大的规模&#xff1a;数千台服务器上的数据量可达 PB 级别&#xff0c;同时保证可靠…

学习java第三十五

Spring事务传播行为&#xff1a; PROPAGATION_REQUIRED(默认) 如果当前没有事务&#xff0c;就新建一个事务&#xff0c;如果已经存在一个事务中&#xff0c;加入到这个事务中 PROPAGATION_SUPPORTS 支持当前事务&#xff0c;如果当前没有事务&#xff0c;就以非事务方式执行 P…

golang语言和JAVA对比

引言: 在当今的软件开发领域,有许多编程语言供开发人员选择。其中,Golang和Java是两种备受开发者青睐的语言。本文将探讨Golang和Java之间的比较和对比,分析它们在语言特性、性能、平台支持、社区和生态系统、开发效率和可维护性等方面的异同。 一、语言特性和性能 Golang…

二维相位解包理论算法和软件【全文翻译-路径跟踪方法(4.1)】

4.1 引言 在第 2 章中我们注意到,从一个像素点开始计算的解包相位可能取决于积分路径。如果我们沿着两条不同的路径从一个像素点到另一个像素点,我们可能会得到两个不同的解包裹相位答案。我们发现,这些不一致是由称为残差的点状结构造成的。残差位于由四个像素组成的 &quo…

加密算法(二)

1、SHA-256加密算法&#xff1a; package com.arithmetic.encryption; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; //使用java.security.MessageDigest类来进行SHA-256摘要的计算。 //通过getInstance("SHA-256")方法获取…

阿里巴巴拍立淘API新功能揭秘:图片秒搜商品,实现智能化个性化购物新体验

在数字化快速发展的今天&#xff0c;智能化和个性化已经成为购物体验中不可或缺的元素。为了满足消费者日益增长的购物需求&#xff0c;阿里巴巴中国站不断推陈出新&#xff0c;其中拍立淘API的新功能——图片秒搜商品&#xff0c;无疑为智能化个性化购物体验开创了新的篇章。 …

js怎样判断status

相信大家都知道Switch开关吧&#xff0c;他有两种状态&#xff0c;通常用1/2表示&#xff0c;开启时为true&#xff0c;关闭时为false&#xff0c;那么我们该怎样判断他是否为开启还是关闭你? 我们可以声明一个变量&#xff0c;让它等于status&#xff0c;判断它是否等于1/2&…

【机器学习入门】使用YOLO模型进行物体检测

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 第6章 人工神经网络(一) 第6章 人工神经网络(二) 卷积和池化 第6章 使用pytorch进行手写数字识别 文章目录 系列文章目录前…

GitHub与Namecheap域名绑定解除指南:删除CNAME文件

github namecheap 域名到期怎么解绑 什么是CNAME文件&#xff1f; CNAME文件是位于你的username.github.io仓库根目录中的一个简单文本文件&#xff0c;它指明了你的GitHub Pages站点要绑定的自定义域名。GitHub通过读取这个文件中的内容来配置DNS解析&#xff0c;从而将你的自…

八股面试速成—计算机网络部分

暑期实习面试在即&#xff0c;这几天八股和算法轮扁我>_ 八股部分打算先找学习视屏跟着画下思维导图&#xff0c;然后看详细的面试知识点&#xff0c;最后刷题 其中导图包含的是常考的题&#xff0c;按照思维导图形式整理&#xff0c;会在复盘后更新 细节研究侧重补全&a…

基于单片机冬季供暖室温调节控制系统

**单片机设计介绍&#xff0c;基于单片机冬季供暖室温调节控制系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的冬季供暖室温调节控制系统是一种集温度检测、控制和显示功能于一体的智能化系统。该系统以单片机为…

Linux多进程下载之aria2c

安装 sudo apt-get install aria2下载 aria2c -x4 [link]在这个命令中&#xff0c;-x4’表示你想要使用4个连接来下载文件。你可以根据你的需求调整这个数字。 如果遇到这个错误&#xff1a;errorCode1 SSL/TLS handshake failure: not signed by known authorities or inva…

C++ 指针与结构

三种存取结构成员的方式&#xff1a; ① 通过结构变量名&#xff1b; ②通过指向结构的指针和间接运算符(*)&#xff1b; ③通过指向结构的指针和指向成员运算符(->);

【已解决】ZIP压缩文件如何设置密码?

ZIP是常用的压缩格式之一&#xff0c;对于重要的ZIP文件&#xff0c;我们还可设置密码保护&#xff0c;那ZIP压缩文件怎么设置密码呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 给ZIP文件设置密码&#xff0c;我们需要用到支持ZIP格式的解压缩软件&#xff0c;比如7…

2024HW-->Wireshark攻击流量分析

在HW中&#xff0c;最离不开的&#xff0c;肯定是看监控了&#xff0c;那么就要去了解一些wireshark的基础用法以及攻击的流量&#xff01;&#xff01;&#xff01;&#xff01; 1.Wireshark的基本用法 比如人家面试官给你一段流量包&#xff0c;你要会用 1.分组详情 对于我…

图像处理ASIC设计方法 笔记14 图像旋转ASIC的错误处理相关设计

目录 1 流水线暂停的处理1)"斜截"2)"直截"2 DSP引发的异常处理1)写异常信号时2)读异常信号时图像旋转ASIC芯片的错误处理方面的设计,分为与FIFO的接口出现异常,和与DSP的接口出现异常两种情况。 本质上,图像旋转ASIC芯片的外部接口设备,也只有FIF…

UE4_如果快速做出毛玻璃效果_假景深

UE4_如果快速做出毛玻璃效果_假景深 2022-08-20 15:02 一个SpiralBlur-SceneTexture材质节点完成效果&#xff0c;启用半透明材质通过修改BlurAmount数值大小调整效果spiralBlur-SceneTexture custom节点&#xff0c;HLSL语言float3 CurColor 0;float2 BaseUV MaterialFloa…

Python学习笔记,格式化字符

1&#xff0c;print(f"{a} {b}")&#xff1b; 2,print("%d %d" % (a, b)); 3,print("{0} {1}".format(1, 2)); 4,print("{0:*<20}".format("jdz")) 在"jdz"的右侧填充"*"&#xff0c;使格式化后的…

pytest的时候输出一个F后面跟很多绿色的点解读

使用pytest来测试pyramid和kotti项目&#xff0c;在kotti项目测试的时候&#xff0c;输出一个F后面跟很多绿色的点&#xff0c;是什么意思呢&#xff1f; 原来在使用pytest进行测试时&#xff0c;输出中的“F”代表一个失败的测试&#xff08;Failed&#xff09;&#xff0c;而…

【00150】2024 金融理论与实务试卷二

目录 一、单选题 二、多选题 三、判断说明题 四、计算题 五、简答题