微服务集成测试 -华为OD机试真题(A卷、JavaScript)

news2025/5/18 7:25:45

在这里插入图片描述

题目描述

现在有n个容器服务,服务的启动可能有一定的依赖性(有些服务启动没有依赖),其次,服务自身启动加载会消耗一些时间。

给你一个n × n 的二维矩阵useTime,其中useTime[i][i]=10表示服务i自身启动加载需要消耗10s,useTime[i][j]=1表示服务i启动依赖服务j启动完成,useTime[i][k]=0表示服务i启动不依赖服务k。其中0 <= i, j, k < n。服务之间没有循环依赖(不会出现环),若想对任意一个服务i进行集成测试(服务i自身也需要加载),求最少需要等待多少时间。

输入描述

第一行输入服务总量n,之后的n行表示服务启动的依赖关系以及自身启动加载耗时,最后输入k表示计算需要等待多少时间后,可以对服务k进行集成测试,其中1 <= k <= n, 1 <= n <= 100

输出描述

最少需要等待多少时间(单位:秒)后,可以对服务k进行集成测试。

示例1

输入:
3
5 0 0
1 5 0
0 1 5
3


输出:
15

说明:
服务3启动依赖服务2,服务2启动依赖服务1,由于服务1、2、3自身加载都需要消耗5s,所以5+5+5=15s,需要等待15s后可以对服务3进行集成测试。

示例2

输入:
3
5 0 0
1 10 1
1 0 11
2

输出:
26

说明:
服务2启动依赖服务1和服务3,服务3启动需要依赖服务1,服务1、2、3自身加载需要消耗5s、10s、11s,所以5+10+11=26s,需要等待26s后可以对服务2进行集成测试。

📌 题目分析

这道题涉及 有向无环图(DAG)上的最长路径问题,可以用 深度优先搜索(DFS)+ 记忆化搜索 来解决。

在这道题中:

  • 节点 代表 容器服务
  • 代表 服务之间的依赖关系
  • 节点的值 代表 服务自身启动的耗时
  • 目标 是计算对某个服务 k 进行集成测试的最少等待时间。

转换思维
题目等价于计算从所有依赖的服务出发,沿依赖路径到 k最长路径和


🧠 解题思路

  1. 建模为有向无环图(DAG)

    • n × n邻接矩阵 useTime 表示 依赖关系自身耗时
    • useTime[i][j] = 1 表示 i 依赖 j
    • useTime[i][i] 代表 服务 i 自身的加载时间
  2. 深度优先搜索(DFS)+ 记忆化搜索

    • 递归求解每个服务的最长路径(即启动 k 之前所需的时间)。
    • 递归时:
      • 如果 i 依赖 j,则先计算 j 的时间。
      • maxTime = max(所有依赖的时间) + 自身启动时间
    • 使用 memo 数组存储计算过的值,避免重复计算。
  3. 最终答案

    • 计算从 所有依赖的服务出发到 k最长路径时间

💻 代码实现

✅ 代码优化 + 详细注释

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

// 记忆化数组,避免重复计算
let memo = {};

// 计算启动服务 `i` 需要的最小等待时间(DFS + 记忆化)
function dfs(useTime, i) {
    // 如果已经计算过,直接返回
    if (memo[i] !== undefined) return memo[i];

    let maxTime = 0;
    for (let k = 0; k < useTime.length; k++) {
        // `useTime[i][k] == 1` 表示 `i` 依赖 `k`,递归计算 `k`
        if (useTime[i][k] === 1 && i !== k) {
            maxTime = Math.max(maxTime, dfs(useTime, k));
        }
    }

    // 计算当前服务 `i` 需要的时间 = 最大依赖时间 + 自身启动时间
    memo[i] = maxTime + useTime[i][i];
    return memo[i];
}

void async function () {
    // 读取服务总数 `n`
    const n = parseInt(await readline());
    const useTime = [];

    // 读取 `n × n` 的矩阵
    for (let i = 0; i < n; i++) {
        let row = (await readline()).split(' ').map(Number);
        useTime.push(row);
    }

    // 读取 `k`,并转换为 0-based 索引
    let k = parseInt(await readline()) - 1;

    // 计算最少需要等待的时间
    console.log(dfs(useTime, k));

    rl.close();
}();

🚀 代码解析

  1. 数据读取

    • 先读取 n(服务数量)。
    • 读取 n × nuseTime 矩阵,表示服务依赖关系和自身启动时间。
    • 读取 k(需要计算的目标服务),并 转换为 0-based 索引
  2. 深度优先搜索(DFS)+ 记忆化

    • 维护 memo 数组,存储已经计算过的时间,避免重复计算(动态规划思想)。
    • 遍历 useTime[i][k] == 1 的依赖项,递归计算其 最长路径和
    • maxTime = max(所有依赖的时间) + 自身启动时间
  3. 最终输出

    • console.log(dfs(useTime, k)); 计算 k 需要的最少等待时间。

📊 复杂度分析

复杂度说明
时间复杂度:O(n²)由于是 DAG(无环图),每个服务最多遍历 n 次,每个 dfs() 调用最多递归 n 层,因此最坏情况是 O(n²)
空间复杂度:O(n)主要存储 memo 数组 和递归栈,最坏情况下 O(n)

✅ 测试 & 运行示例

📌 示例 1

🔹 输入

3
5 0 0
1 5 0
0 1 5
3

🔹 计算过程

服务 3 依赖 服务 2
服务 2 依赖 服务 1
服务 1 自身耗时 5s
服务 2 自身耗时 5s
服务 3 自身耗时 5s
总时间 = 5 + 5 + 5 = 15s

🔹 输出

15

📌 示例 2

🔹 输入

3
5 0 0
1 10 1
1 0 11
2

🔹 计算过程

服务 2 依赖 服务 1、服务 3
服务 3 依赖 服务 1
服务 1 自身耗时 5s
服务 3 自身耗时 11s(依赖 服务 1)
服务 2 自身耗时 10s(依赖 服务 1、服务 3)

最长路径 = 5 + 11 + 10 = 26s

🔹 输出

26

🔎 总结

方法特点适用场景
DFS + 记忆化递归遍历 DAG,存储计算结果,避免重复计算适用于 有向无环图(DAG)上的最长路径
拓扑排序 + 动态规划(DP)依赖 入度计算,从 无依赖的节点 逐步计算适用于 大规模 DAG 依赖关系

✅ 方案优势

  • 使用 DFS + 记忆化,避免重复计算,优化 O(n²)
  • 代码简洁,符合递归求最长路径的思路
  • 无环保证,直接计算最长路径,无需拓扑排序

🔚 结论

这道题本质上是 有向无环图(DAG)上的最长路径问题,可以用 DFS + 记忆化 优化。通过递归计算 最长依赖链的时间,最终求出 启动服务 k 需要的最少时间

如果数据规模更大(如 n > 10^5),可以考虑拓扑排序+DP 解法! 🚀

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

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

相关文章

Mac: 运行python读取CSV出现 permissionError

在MAC机器里&#xff0c;之前一直运行程序在某个指定的目录下读取excel和csv文件&#xff0c;没有出现错误&#xff0c;有一天突然出现错误&#xff1a;permissionError:[Errno 1] Operation not permitted&#xff0c; 具体错误信息如下&#xff1a; 经过调查得知&#xff0c…

UE5 学习笔记 FPS游戏制作30 显示击杀信息 水平框 UI模板(预制体)

文章目录 一制作单条死亡信息框水平框的使用创建一个水平框添加子元素调整子元素顺序子元素的布局插槽尺寸填充对齐 制作UI 根据队伍&#xff0c;设置文本的名字和颜色声明变量 将变量设置为构造参数根据队伍&#xff0c;设置文本的名字和颜色在构造事件中&#xff0c;获取玩家…

西门子TCP通讯过程中硬件连接突然断开

通信原理探秘又结合在工作中遇到的问题,关注到了通讯中的KeepAlive定时器的设置,所以做了如下实验。 硬件: 1513PLC TCP客户端 PC TCP服务器 前提条件:禁用PLC侧KeepAlive 程序: 测试流程: 打开PC端网络调试助手,设置为TCP服务器,打开链接; PC端打开WireShack软…

2025宁德时代测评Verify考什么?网申测评如何通过SHL笔试|附真题线上笔试考点、高分攻略、CATL新能源科技SHL测评宁德社招题目、面试攻略、求职建议

——职小豚 带你拆解新能源巨头招聘密码 一、宁德时代&#xff1a;新能源赛道「超级独角兽」 作为全球动力电池龙头&#xff0c;宁德时代&#xff08;CATL&#xff09;的江湖地位无需多言&#xff1a; 技术硬实力&#xff1a;麒麟电池、钠离子电池、无钴电池等黑科技加持&…

Spring Boot @RequestParam 解析参数时的常见问题及解决方案

1&#xff0c;遇到的问题&#xff1a;将后端接口写完后我想通过PostMan进行简单的测试一下&#xff0c;一不小心就遇到了这样的情况&#xff1a; org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter contractId is not prese…

Firefox 浏览器同步一个账户和书签网址

Firefox 浏览器同步一个账户和书签网址 Firefox 支持跨设备接续浏览&#xff0c;可实现电脑、手机与平板无缝衔接。无论您在使用哪台设备上使用 Firefox&#xff0c;都能获取书签、浏览历史、保存的密码等信息。当然也能实现windows、ios、linux、android系统中安装firefox浏览…

Maven多模块项目,其他项目引用子模块的依赖,无法打包,提示没有找到依赖

背景&#xff1a; 微服务项目 每个服务都是单独的项目&#xff0c;会存在依赖关联的问题&#xff0c;在子模块的下面 depoly 之后&#xff0c;就会出现别的项目&#xff0c;无法package 原因&#xff1a; 多模块项目&#xff0c;depoly 需要在父模块下面执行

mediacodec服务启动时加载media_codecs.xml

media.codec服务启动时&#xff0c; 会创建 implementation::Omx 和 implementation::OmxStore&#xff0c; 构造 Omx时&#xff0c; 会解析codec相关的xml文件&#xff0c;一般从会如下目录中&#xff0c; // from getDefaultSearchDirs() { "/product/etc",&quo…

本地部署DeepSeek-R1(Dify压力测试和性能调优)

安装压测软件 为了有效测试&#xff0c;应在局域网设备测试&#xff0c;我这里用的服务器是局域网内的Ubuntu&#xff0c;下载的压测软件是WRK apt install wrk测试脚本 为了省事我直接在/root目录下新建lua脚本 vim test.lua脚本内容如下&#xff0c;app-xxxx更换为你工作…

自动备份文件到服务器,自动备份文件到服务器有哪些方法?

将SQL Server数据库自动备份文件到服务器&#xff0c;可以通过多种方法实现。以下是几种常用的方法&#xff1a; 一、使用SQL Server Management Studio&#xff08;SSMS&#xff09;和SQL Server代理 配置SQL Server代理&#xff1a;确保SQL Server代理服务已启动。如果未启…

Ollama+open-webui搭建私有本地大模型详细教程

Ollamaopen-webui搭建私有本地大模型详细教程 1. 什么是 Ollama&#xff1f; 1.1. Ollama 简介 ​ Ollama 是一个轻量级的 AI 模型运行时&#xff0c;专注于简化 AI 模型的部署和使用。它支持多种预训练模型&#xff08;如 Llama、Vicuna、Dolly 等&#xff09;&#xff0c;…

GPT-4o 原生图像生成技术解析:从模型架构到吉卜力梦境的实现

最近不少 AI 爱好者、设计师、Vlogger 在社交平台晒出了 GPT-4o 生成的梦幻图像&#xff0c;尤其是吉卜力风格的作品——柔和光影、日系构图、治愈色彩、富有情感的角色表达&#xff0c;一下子击中了无数人的“童年回忆 审美舒适区”。 &#x1f3a8; 下面是一些 GPT-4o 实际生…

测试cursor-AI编辑器

Cursor是一个免费的&#xff0c;内置AI插件的编辑器&#xff0c;在vscode基础上开发&#xff0c;可以创建和分析代码&#xff0c;还能提出修改建议。官网是 https://www.cursor.com/cn 载入SFTP的方式跟vscode是一样的&#xff0c;但是会有这样的报错&#xff1a; 报错&#x…

[首发]烽火HG680-KD-海思MV320芯片-2+8G-安卓9.0-强刷卡刷固件包

烽火HG680-KD-海思MV320芯片-28G-安卓9.0-强刷卡刷固件包 U盘强刷刷机步骤&#xff1a; 1、强刷刷机&#xff0c;用一个usb2.0的8G以下U盘&#xff0c;fat32&#xff0c;2048块单分区格式化&#xff08;强刷对&#xff35;盘非常非常挑剔&#xff0c;usb2.0的4G U盘兼容的多&a…

Spring Boot 快速入手

前言&#xff1a;为什么选择 Spring Boot&#xff1f; &#x1f680; 在现代 Java 开发中&#xff0c;Spring Boot 已成为最流行的后端框架之一。无论是小型 Web 应用、企业级系统&#xff0c;还是微服务架构&#xff0c;Spring Boot 都能提供快速开发、自动配置、轻量级部署的…

OpenAI最近放出大新闻,准备在接下来的几个月内推出一款“开放”的语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理

基于PyQt5的自动化任务管理软件&#xff1a;高效、智能的任务调度与执行管理 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着…

自动驾驶---学术论文的常客:nuScenes数据集的使用

1 前言 nuScenes 数据集在大模型训练中应用广泛&#xff0c;在很多CVPR或者其它论文中经常能看到使用nuScenes 数据集达到SOTA水平。 在之前的博客《自动驾驶---学术论文的常客&#xff1a;nuScenes 数据集》中&#xff0c;笔者主要介绍了nuScenes数据集的来源和下载方式&#…

使用大语言模型进行Python图表可视化

Python使用matplotlib进行可视化一直有2个问题&#xff0c;一是代码繁琐&#xff0c;二是默认模板比较丑。因此发展出seaborn等在matplotlib上二次开发&#xff0c;以更少的代码进行画图的和美化的库&#xff0c;但是这也带来了定制化不足的问题。在大模型时代&#xff0c;这个…

C#调用ACCESS数据库,解决“Microsoft.ACE.OLEDB.12.0”未注册问题

C#调用ACCESS数据库&#xff0c;解决“Microsoft.ACE.OLEDB.12.0”未注册问题 解决方法&#xff1a; 1.将C#采用的平台从AnyCpu改成X64 2.将官网下载的“Microsoft Access 2010 数据库引擎可再发行程序包AccessDatabaseEngine_X64”文件解压 3.安装解压后的文件 点击下载安…