华为OD机试真题——启动多任务排序(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

news2025/6/9 12:40:15

在这里插入图片描述

2025 B卷 200分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》

华为OD机试真题《启动多任务排序》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C++

C

GO


题目名称:启动多任务排序


  1. 知识点:拓扑排序(贪心策略)、字符串处理、逻辑分析
  2. 时间限制:1秒
  3. 空间限制:256MB
  4. 限定语言:不限

题目描述

一个应用启动时,会有多个初始化任务需要执行,且任务之间存在依赖关系。例如,任务A依赖任务B,则必须在B执行完成后才能开始执行A。现给出多条任务依赖规则,要求输出任务的执行顺序序列。规则采用贪婪策略

  1. 若任务无依赖,则立即执行。
  2. 若多个任务可同时执行,按任务名称的字母顺序排序。

输入描述

  • 输入参数为多个依赖关系,用空格分隔。
  • 依赖关系格式为 X->Y,表示任务X依赖任务Y(即Y需先于X执行)。
  • 示例输入:A->B C->B

输出描述

  • 输出排序后的任务列表,用空格分隔。
  • 示例输出:B A C

示例说明

  • 输入 A->B C->B 表示:
    • A依赖B,C依赖B → B无依赖,优先执行;A和C均依赖B,但按字母顺序输出A在前。
  • 输出顺序为 B A C

Java

问题分析

我们需要解决任务的执行顺序问题,任务之间存在依赖关系,同时在多个任务可执行时按字母顺序选择。这属于典型的拓扑排序问题,但需要结合贪心策略选择字典序最小的任务。

解题思路

  1. 构建依赖图:将所有任务及其依赖关系转化为有向图,边表示依赖方向。
  2. 统计入度:记录每个任务的入度(前置依赖的数量)。
  3. 优先队列处理:使用优先队列存储当前可执行的任务(入度为0),按字母顺序取出任务。
  4. 拓扑排序:依次处理队列中的任务,减少其后继任务的入度,将新的可执行任务加入队列。

代码实现

import java.util.*;

public class Main {
   
    public static void main(String[] args) {
   
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        String[] dependencies = input.split(" ");

        Set<String> allNodes = new HashSet<>();
        Map<String, Set<String>> adj = new HashMap<>();
        Map<String, Integer> inDegree = new HashMap<>();

        for (String dep : dependencies) {
   
            if (dep.isEmpty()) continue;
            String[] parts = dep.split("->");
            if (parts.length != 2) continue;

            String x = parts[0];
            String y = parts[1];
            allNodes.add(x);
            allNodes.add(y);

            adj.computeIfAbsent(y, k -> new HashSet<>());
            if (adj.get(y).add(x)) {
    // 确保边不重复
                inDegree.put(x, inDegree.getOrDefault(x, 0) + 1);
            }
        }

        // 初始化入度:确保所有任务的入度被记录
        for (String node : allNodes) {
   
            inDegree.putIfAbsent(node, 0);
        }

        // 优先队列按字母顺序排序
        PriorityQueue<String> queue = new PriorityQueue<>();
        for (String node : inDegree.keySet()) {
   
            if (inDegree.get(node) == 0) {
   
                queue.offer(node);
            }
        }

        List<String> result = new ArrayList<>();
        while (!queue.isEmpty()) {
   
            String curr = queue.poll();
            result.add(curr);
            if (adj.containsKey(curr)) {
   
                for (String neighbor : adj.get(curr)) {
   
                    inDegree.put(neighbor, inDegree.get(neighbor) - 1);
                    if (inDegree.get(neighbor) == 0) {
   
                        queue.offer(neighbor);
                    }
                }
            }
        }

        System.out.println(String.join(" ", result));
    }
}

代码解析

  1. 读取输入:使用 Scanner 读取输入行,按空格分割得到多个依赖关系。
  2. 数据结构初始化
    • allNodes:收集所有任务节点。
    • adj:邻接表,记录每个节点的后续任务。
    • inDegree:记录每个任务的入度数。
  3. 处理依赖关系
    • 分割每个依赖关系为X->Y,将X和Y加入节点集合。
    • 构建邻接表,添加边Y→X,确保边不重复,并更新X的入度。
  4. 初始化入度:确保每个节点的入度被正确记录,即使没有依赖。
  5. 优先队列初始化:将所有入度为0的任务加入队列,按字典序排序。
  6. 拓扑排序:依次处理队列中的任务,更新其后继任务的入度,将新的可执行任务加入队列。
  7. 输出结果:将拓扑排序结果按空格连接输出。

示例测试

示例1输入

A->B C->B

输出

B A C

解析:B无依赖先执行,A和C依赖B,按字母顺序执行A后C。

示例2输入

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

输出

A B D C

解析:A无依赖先执行,B依赖A,执行B后D依赖B,最后执行C。

示例3输入

X->Y Y->Z

输出

Z Y X

解析:Z无依赖先执行,Y依赖Z,之后X依赖Y。

综合分析

  • 时间复杂度:拓扑排序的时间复杂度为O(N + E),其中N为任务数,E为边数。优先队列的插入和取出操作为O(log N),整体复杂度O(N log N + E)。
  • 空间复杂度:存储邻接表和入度表的空间复杂度为O(N + E)。
  • 正确性:贪心选择字典序最小的任务保证了题目要求的顺序,拓扑排序确保依赖关系正确。
  • 适用性:适用于任务调度、编译顺序等需要依赖管理的场景,高效处理数千级别的节点和边。

python

问题分析

我们需要根据任务的依赖关系确定执行顺序,多个可执行任务时按字母顺序选择。这可以通过拓扑排序结合贪心策略实现,使用优先队列处理当前可执行任务。

解题思路

  1. 构建依赖图:将每个任务的依赖关系转化为有向边,记录每个任务的入度(前置依赖的数量)。
  2. 优先队列初始化:将入度为0的任务按字母顺序加入优先队列。
  3. 拓扑排序:依次执行队列中的任务,减少其后继任务的入度,将新可执行任务加入队列。
  4. 处理顺序:按字母顺序选择任务,确保符合题目要求。

代码实现

import sys
import heapq
from collections import defaultdict

def main():
    input_str = sys.stdin.read().strip()
    dependencies = input_str.split()
    
    adj = defaultdict(list)
    in_degree = defaultdict(int)
    all_nodes = set()
    
    for dep in dependencies:
        if '->' not in dep:
            continue
        x, y = dep.split('->')
        all_nodes.add(x)
        all_nodes.add(y)
        adj[y]

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

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

相关文章

大模型时代,Python 近红外光谱与 Transformer 模型:学习的必要性探究

在当下大语言模型盛行的时代&#xff0c;各类新技术如潮水般不断涌现&#xff0c;让人应接不暇。身处这样的浪潮之中&#xff0c;不少人心中都会泛起疑问&#xff1a;Python 近红外光谱和 Transformer 模型还有学习的必要性吗&#xff1f;今天&#xff0c;就让我们深入探讨一番…

梯度优化提示词:精准引导AI分类

基于梯度优化的提示词工程方法,通过迭代调整提示词的嵌入向量,使其能够更有效地引导模型做出正确分类。 数据形式 训练数据 train_data 是一个列表,每个元素是一个字典,包含两个键: text: 需要分类的文本描述label: 对应的标签(“冲动"或"理性”)示例数据: …

AUTOSAR 运行时环境 (RTE)

目录 往期推荐 什么是运行时环境&#xff1f; AUTOSAR 中的运行时环境 (RTE) RTE 的应用 RTE 的生成 关于RTE API的一些信息 RTE生成后文件之间的关系 往期推荐 2025汽车行业新宠&#xff1a;欧企都在用的工具软件ETAS工具链自动化实战指南&#xff1c;一&#xff1e;ET…

SQLMesh 宏操作符详解:提升 SQL 查询的灵活性与效率

SQLMesh 提供了一系列强大的宏操作符&#xff08;如 WITH、JOIN、WHERE 等&#xff09;&#xff0c;用于动态构建 SQL 查询。这些操作符不仅简化了复杂查询的编写&#xff0c;还提高了代码的可读性和可维护性。本文将深入探讨这些操作符的使用场景、语法及实际案例&#xff0c;…

基于Flink的数据中台管理平台

基于Flink做的数据中台工程项目。数据从source到clickhouse全流程的验证。集成元数据管、数据资产、数据发现功能&#xff0c;自主管理元数据变更&#xff0c;集成元数据版本管理。 同时&#xff0c;对整个大数据集群使用到的组件或者是工具进行管理。比如nacos、kafka、zookee…

AI-Ready TapData:如何基于 MCP 协构建企业级 AI 实时数据中枢?(含教程)

随着企业对私有大模型、行业大模型的探索逐渐深入&#xff0c;“AI应用是否真正落地”&#xff0c;越来越取决于企业是否拥有结构化、实时、可交互的高质量数据。而现实是&#xff0c;大多数企业的核心业务数据依旧被困在多个异构系统、孤岛数据库和 ETL 流程之中&#xff0c;导…

Spring Boot 登录实现:JWT 与 Session 全面对比与实战讲解

Spring Boot 登录实现&#xff1a;JWT 与 Session 全面对比与实战讲解 2025.5.21-23:11今天在学习黑马点评时突然发现用的是与苍穹外卖jwt不一样的登录方式-Session&#xff0c;于是就想记录一下这两种方式有什么不同 在实际开发中&#xff0c;登录认证是后端最基础也是最重要…

SpringBoot 项目实现操作日志的记录(使用 AOP 注解模式)

本文是博主在做关于如何记录用户操作日志时做的记录&#xff0c;常见的项目中难免存在一些需要记录重要日志的部分&#xff0c;例如权限和角色设定&#xff0c;重要数据的操作等部分。 博主使用 Spring 中的 AOP 功能&#xff0c;结合注解的方式&#xff0c;对用户操作过的一些…

AI|Java开发 IntelliJ IDEA中接入本地部署的deepseek方法

目录 连接本地部署的deepseek&#xff1a; IntelliJ IDEA中使用deepseek等AI&#xff1a; 用法一&#xff1a;让AI写代码 用法二&#xff1a;选中这段代码&#xff0c;右键&#xff0c;可以让其解释这段代码的含义。这时显示的解释是英文的。 连接本地部署的deepseek&#…

【1——Android端添加隐私协议(unity)1/3】

前言&#xff1a;这篇仅对于unity 发布Android端上架国内应用商店添加隐私协议&#xff0c;隐私协议是很重要的东西&#xff0c;没有这个东西&#xff0c;是不上了应用商店的。 对于仅仅添加隐私协议&#xff0c;我知道有三种方式,第一种和第二种基本一样 1.直接在unity里面新…

Linux之概述和安装vm虚拟机

文章目录 操作系统概述硬件和软件操作系统常见操作系统 初识LinuxLinux的诞生Linux内核Linux发行版 虚拟机介绍虚拟机 VMware WorkStation安装虚拟化软件VMware WorkStation 安装查看VM网络连接设置VM存储位置 在VMware上安装Linux(发行版CentOS7)安装包获取CentOS7 安装 Mac系…

LeetCode热题100--19.删除链表的倒数第N个结点--中等

1. 题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 示例…

git学习与使用(远程仓库、分支、工作流)

文章目录 前言简介git的工作流程git的安装配置git环境&#xff1a;git config --globalgit的基本使用新建目录初始化仓库&#xff08;repository&#xff09;添加到暂存区新增/修改/删除 文件状态会改变 提交到仓库查看提交&#xff08;commit&#xff09;的历史记录git其他命令…

《Android 应用开发基础教程》——第十四章:Android 多线程编程与异步任务机制(Handler、AsyncTask、线程池等)

目录 第十四章&#xff1a;Android 多线程编程与异步任务机制&#xff08;Handler、AsyncTask、线程池等&#xff09; &#x1f538; 14.1 为什么需要多线程&#xff1f; &#x1f538; 14.2 Handler Thread 模型 ✦ 使用 Handler 与 Thread 进行线程通信 ✦ 简要说明&am…

【JVM 01-引言入门篇】

JVM 引言篇01 笔记记录 1. 什么是JVM&#xff1f;2. 学习JVM有什么用&#xff1f;3. 常见的JVM4. 学习路线 学习资料来源-b站黑马 1. 什么是JVM&#xff1f; 定义&#xff1a;Java虚拟机&#xff08;Java Virtual Machine 简称JVM&#xff09;是运行所有Java程序的抽象计算机&a…

Pandas数据规整

&#xff08;1&#xff09;层次化索引 1.创建带层次化索引的df 第一种&#xff0c;直接创建 import pandas as pd import numpy as npdata pd.Series(np.random.randn(9),index [[a, a, a, b, b, c, c, d, d],[1, 2, 3, 1, 3, 1, 2, 2, 3]]) print(data) # a 1 -0.6416…

ThreadLocal线程本地变量在dubbo服务使用时候遇到的一个坑

我昨天遇到一个问题&#xff0c;就是我springboot项目里面有一个提供代办服务审核的dubbo接口&#xff0c;这个接口给房源项目调用&#xff0c;但是碰到一个问题就是&#xff0c;房源项目每天凌晨5点会查询满足条件过期的数据&#xff0c;然后调用我这边的代办审核dubbo接口&am…

从 0 到 1:Spring Boot 与 Spring AI 深度实战(基于深度求索 DeepSeek)

在人工智能技术与企业级开发深度融合的今天&#xff0c;传统软件开发模式与 AI 工程化开发的差异日益显著。作为 Spring 生态体系中专注于 AI 工程化的核心框架&#xff0c;Spring AI通过标准化集成方案大幅降低 AI 应用开发门槛。本文将以国产大模型代表 ** 深度求索&#xff…

upload-labs通关笔记-第20关 文件上传之杠点绕过

系列目录 upload-labs通关笔记-第1关 文件上传之前端绕过&#xff08;3种渗透方法&#xff09; upload-labs通关笔记-第2关 文件上传之MIME绕过-CSDN博客 upload-labs通关笔记-第3关 文件上传之黑名单绕过-CSDN博客 upload-labs通关笔记-第4关 文件上传之.htacess绕过-CSDN…

Vscode +Keil Assistant编译报错处理

Vscode Keil Assistant编译报错处理 1.报错图片内容 所在位置 行:1 字符: 25 chcp.com 65001 -Command & c:\Users\92170.vscode\extensions\cl.keil-a … ~ 不允许使用与号(&)。& 运算符是为将来使用而保留的&#xff1b;请用双引号将与号引起来(“&”)&…