华为OD机试 - 启动多任务排序 - 拓扑排序(Java 2024 D卷 200分)

news2025/1/18 4:38:39

在这里插入图片描述

华为OD机试 2024D卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。

现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则立刻开始执行,如果同时有多个任务要执行,则根据任务名称字母顺序排序。

例如:B任务依赖A任务,C任务依赖A任务,D任务依赖B任务和C任务,同时,D任务还依赖E任务。那么执行任务的顺序由先到后是:A任务,E任务,B任务,C任务,D任务。这里A和E任务都是没有依赖的,立即执行。

二、输入描述

输入参数每个元素都表示任意两个任务之间的依赖关系,输入参数中符号->表示依赖方向,例A->B表示A依赖B,多个依赖之间用单个空格分割。

三、输出描述

输出为排序后的启动任务列表,多个任务之间用单个空格分割。

1、输入

A->B C->B

2、输出

B A C

3、说明

任务A和C都依赖于任务B。任务B执行后,A和C立即执行,A和C的执行顺序按照字典序排列。

四、解题思路

这道题目涉及有向无环图(DAG)的拓扑排序问题。我们需要按照任务的依赖关系顺序来安排任务的执行,确保每个任务在其依赖任务之后执行。如果同时有多个任务可以执行,则按照任务名称的字母顺序进行排列。以下是具体的解题思路:

  1. 解析输入:
    • 将输入的依赖关系字符串解析成任务之间的依赖关系对。
  2. 构建依赖图和入度表:
    • 使用两个哈希表来表示任务的依赖关系图和每个任务的入度(被依赖的次数)。
    • 依赖关系图使用 Map<String, List>,记录每个任务的后续任务。
    • 入度表使用 Map<String, Integer>,记录每个任务的入度值。
  3. 初始化准备队列:
    • 使用一个列表 readyTasks 来存储所有入度为0的任务(即没有任何依赖任务,可以直接执行)。
    • 遍历入度表,将所有入度为0的任务加入准备队列。
  4. 拓扑排序:
    • 使用 StringJoiner 构建任务的最终执行顺序。
    • 通过一个 while 循环处理准备队列中的任务:
    • 按字母顺序对当前准备执行的任务进行排序。
    • 依次处理每个准备好的任务,将其添加到执行顺序中。
    • 遍历当前任务的所有后续任务,更新它们的入度值。如果某个后续任务的入度变为0,则将其加入下一轮的准备队列。
    • 将当前轮的准备队列更新为下一轮的准备队列,继续处理。
  5. 输出结果:
    • 输出最终的任务执行顺序,确保任务按依赖关系和字母顺序正确排列。

五、Java算法源码

public class Test01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取输入的依赖关系,并分割成二维数组
        String[][] dependencies = Arrays.stream(scanner.nextLine().split(" "))
                .map(s -> s.split("->"))
                .toArray(String[][]::new);

        // 用于记录每个任务的入度(有多少任务依赖它)
        Map<String, Integer> taskInDegree = new HashMap<>();

        // 用于记录每个任务的依赖关系图
        Map<String, List<String>> taskGraph = new HashMap<>();

        // 构建图和入度表
        for (String[] dependency : dependencies) {
            String dependentTask = dependency[0]; // 依赖任务
            String prerequisiteTask = dependency[1]; // 前置任务

            // 初始化前置任务的入度为0
            taskInDegree.put(prerequisiteTask, taskInDegree.getOrDefault(prerequisiteTask, 0));
            // 增加依赖任务的入度
            taskInDegree.put(dependentTask, taskInDegree.getOrDefault(dependentTask, 0) + 1);

            // 构建依赖关系图
            taskGraph.putIfAbsent(prerequisiteTask, new ArrayList<>());
            taskGraph.get(prerequisiteTask).add(dependentTask);
            taskGraph.putIfAbsent(dependentTask, new ArrayList<>());
        }

        // 用于存储所有入度为0的任务(没有依赖的任务)
        List<String> readyTasks = new ArrayList<>();
        for (String task : taskInDegree.keySet()) {
            if (taskInDegree.get(task) == 0) {
                readyTasks.add(task);
            }
        }

        // 用于构建最终的任务执行顺序
        StringJoiner executionOrder = new StringJoiner(" ");

        // 处理所有准备好的任务
        while (!readyTasks.isEmpty()) {
            // 如果同时有多个任务要执行,则根据任务名称字母顺序排序
            readyTasks.sort(String::compareTo);

            // 用于存储下一轮入度为0的任务
            List<String> nextReadyTasks = new ArrayList<>();

            // 处理当前轮所有的准备好执行的任务
            for (String currentTask : readyTasks) {
                executionOrder.add(currentTask); // 将任务添加到执行顺序中

                // 遍历当前任务的所有后继任务
                for (String nextTask : taskGraph.get(currentTask)) {
                    taskInDegree.put(nextTask, taskInDegree.get(nextTask) - 1); // 将后继任务的入度减1

                    // 如果后继任务的入度变为0,则将其加入下一轮的准备队列
                    if (taskInDegree.get(nextTask) == 0) {
                        nextReadyTasks.add(nextTask);
                    }
                }
            }

            // 准备处理下一轮的任务
            readyTasks = nextReadyTasks;
        }

        // 输出最终的任务执行顺序
        System.out.println(executionOrder);
        scanner.close(); // 关闭扫描器
    }
}

六、效果展示

1、输入

B->A C->A D->B D->C D->E

2、输出

A E B C D

3、说明

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

如何做好一个企业家IP:塑造独特的个人品牌

在当今数字化时代&#xff0c;个人品牌的力量愈发凸显&#xff0c;对于企业家而言&#xff0c;一个强大的IP&#xff08;Intellectual Property&#xff0c;即知识产权或个人品牌&#xff09;不仅有助于提升个人影响力&#xff0c;还能为企业的发展注入强大动力。那么&#xff…

BGE M3-Embedding 模型介绍

BGE M3-Embedding来自BAAI和中国科学技术大学&#xff0c;是BAAI开源的模型。相关论文在https://arxiv.org/abs/2402.03216&#xff0c;论文提出了一种新的embedding模型&#xff0c;称为M3-Embedding&#xff0c;它在多语言性&#xff08;Multi-Linguality&#xff09;、多功能…

Feign 原理流程图练习-01

目录 作业: 老师给的参考流程图 要求 解答 知识扩展 Feign基础原理 接口定义 代理对象生成 请求调用 请求发送 响应处理 容错与熔断 总结 作业: 老师给的参考流程图 pdf版本 【金山文档 | WPS云文档】 Feign https://kdocs.cn/l/ctbagIyxN348 ​ 要求 结合上面…

[C++][设计模式][状态模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一2.代码二 1.动机 在软件构建过程中&#xff0c;某些对象的状态如果改变&#xff0c;其行为也会随之而放生变化 比如文档处于只读状态&#xff0c;其支持的行为和读写状态支持的行为就可能完全不同 如何在运行时根据对象的状…

STM32 SWD烧写

最小电路 stm32f103x 内部已经集成了振荡电路&#xff0c;可以省略&#xff1b;rst引脚电路&#xff0c;可以省略&#xff0c;boot0,boot1不需要设置 正常烧录 -------------------------------------------------------------------STM32CubeProgrammer v2.9.0 …

antd Select前端加模糊搜索

背景&#xff1a;前端的小伙伴经常在开发antd Select的时候后端不提供搜索模糊搜索接口&#xff0c;而是全量返回数据&#xff0c;这个时候就需要我们前端自己来写一个模糊搜索了。 效果 代码截图 代码 <SelectshowSearchmode"multiple"options{studioList}filte…

读AI新生:破解人机共存密码笔记17不确定性和概率

1. 前向搜索 1.1. 通过前向搜索&#xff0c;通过考虑各种可能的动作序列的结果&#xff0c;来选择动作&#xff0c;是智能系统的基本能力 1.2. 如果一家卡车运输公司想要优化其100辆卡车在美国的运输&#xff0c;那么该公司可能需要考虑的状态数量将是10^700个 1.3. 几乎所有…

leetcode 第133场双周赛 100333.统计逆序对的数目【计数dp/滚动数组/前缀和优化】

分析&#xff1a; 先考虑如下问题。 求长度为n&#xff0c;逆序对为m的排列数量。 可以考虑dp&#xff0c;dp[i][j]定义为长度为i&#xff0c;逆序对为j的排列数量。 dp[1][0] 1; //枚举排列长度&#xff0c;或者认为枚举当前需要插到长度为i-1的排列中的数字 for(int i 1…

Mini-Contract电子合同在线签署小程序源码

Mini-Contract电子合同在线签署小程序源码&#xff0c;采用的是uniapp Vue3框架搭建&#xff0c;只有前端源码是一个聚合市场上各类电子合同解决方案商的工具&#xff0c;让用户无需一个个对接电子合同厂商&#xff0c;节省时间和精力。该程序提供了简洁的代码和最新的技术栈&a…

C++ | Leetcode C++题解之第208题实现Trie(前缀树)

题目&#xff1a; 题解&#xff1a; class Trie { private:vector<Trie*> children;bool isEnd;Trie* searchPrefix(string prefix) {Trie* node this;for (char ch : prefix) {ch - a;if (node->children[ch] nullptr) {return nullptr;}node node->children[…

现代信息检索笔记(二)

目录 信息检索概述 IR vs数据库: 结构化vs 非结构化数据 结构化数据 非结构化数据 半结构化数据 传统信息检索VS现代信息检索 布尔检索 倒排索引 一个例子 建立词项&#xff08;可以是字、词、短语、一句话&#xff09;-文档的关联矩阵。 关联向量 检索效果的评价 …

【IVI】car_service 命令行工具

【IVI】car_service 命令行工具 1、car_service服务执行2、CarShellCommand命令执行2.1 cmd car_service day-night-mode day设置白天模式2.2 cmd car_service inject-vhal-event vhal信号事件2.2.1 VehiclePropertyIds2.2.2 模拟驾驶事件 2.3 cmd car_service inject-error-ev…

STM32MP135裸机编程:使用软件触发硬件复位

0 参考资料 STM32MP13xx参考手册.pdf 1 使用寄存器实现软件复位 1.1 复位电路概述 重点关注下面标红的路线&#xff1a; 通过这条路线可以清楚看到&#xff0c;我们可以通过设置RCC_MP_GRSTCSETR寄存器让RPCTL&#xff08;复位脉冲控制器&#xff09;给NRST&#xff08;硬件复…

hmall-服务保护和分布式事务

1. 微服务保护 1.1 服务保护方案 1.1.1 请求限流 服务故障最重要原因&#xff0c;就是并发太高&#xff01;解决了这个问题&#xff0c;就能避免大部分故障。当然&#xff0c;接口的并发不是一直很高&#xff0c;而是突发的。因此请求限流&#xff0c;就是限制或控制接口访问…

常见容性负载组应用

什么是容性负载&#xff1f; 在交流系统中&#xff0c;电压和电流随电源的频率而上升和下降。电压和电流是否一起上升取决于负载的特性&#xff0c;负载有三种类型。电阻负载&#xff08;例如加热元件和白炽灯&#xff09;的影响最小&#xff0c;电压和电流一起上升和下降&…

Vue3学习笔记<->创建第一个vue项目(2)

新建一个项目目录 找一个盘新建一个目录&#xff0c;我这里在D盘创建一个vuedemo目录作为项目存放的目录。使用idea打开目录。   单击ieda底部的按钮“Terminal”&#xff0c;打开命令行窗口&#xff0c;如果命令行窗口当前目录不是“vuedemo”&#xff0c;就切换到“vuedem…

九浅一深Jemalloc5.3.0 -- ②浅*size class

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是极其枯燥的&#xff0c;…

web渗透-反序列化漏洞

一、简介 就是把一个对象变成可以传输的字符串&#xff0c;目的就是为了方便传输。假设&#xff0c;我们写了一个class,这个class里面存有一些变量。当这个class被实例化了之后&#xff0c;在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量&#xff0…

压缩包怎么解压,解压压缩包不损坏文件

常见格式&#xff1a; ZIP&#xff1a;最常见的压缩文件格式之一&#xff0c;支持跨平台。RAR&#xff1a;另一种常见的压缩文件格式&#xff0c;通常压缩率比ZIP高&#xff0c;但不如ZIP普及。7Z&#xff1a;来自7-Zip的压缩格式&#xff0c;支持更高的压缩率和一些高级特性。…

长沙高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

长沙高校大学智能制造实验室始终站在科技前沿&#xff0c;不断探索和实践智能制造的新技术、新方法。数字孪生技术作为智能制造领域的重要分支&#xff0c;其通过将物理世界的实体映射到数字世界&#xff0c;实现对实体的实时监测、模拟和分析&#xff0c;为智能制造提供了强大…