微服务的集成测试

题目描述

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

给你一个n × n 的二维矩阵useTime,其中useTime[i][i]=10表示服务i自身启动加载需要消耗10s,useTime[i][j]=1表示服务i启动依赖服务j启动完成,useTime[i][k]=0表示服务i启动不依赖服务k。其中o <= 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进行集成测试。

C++

#include <bits/stdc++.h>

using namespace std;

// 深度优先搜索(DFS)计算服务i最早可以进行集成测试的时间
int dfs(vector<vector<int>> &useTime, vector<int> &dp, int i) {
    // 如果已经计算过该服务的最早测试时间,直接返回
    if (dp[i] != -1) return dp[i];

    int maxTime = 0;  // 记录服务i的所有依赖服务的最大等待时间
    // 遍历所有可能的服务k
    for (int k = 0; k < useTime.size(); k++) {
        if (useTime[i][k] == 1 && i != k) {  // 服务i依赖服务k
            maxTime = max(maxTime, dfs(useTime, dp, k));  // 获取服务k的最早启动时间
        }
    }
    // 当前服务i的最早启动时间为它的所有依赖服务的最大时间 + 它自身的启动加载时间
    dp[i] = maxTime + useTime[i][i];
    return dp[i];
}

int main() {
    int n, k;
    cin >> n;  // 读取服务数量
    vector<vector<int>> useTime(n, vector<int>(n));  // 初始化依赖矩阵
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> useTime[i][j];  // 读取依赖关系矩阵
        }
    }

    cin >> k;  // 读取需要集成测试的服务k
    vector<int> dp(n, -1);  // dp数组,用于记忆化存储每个服务的最早集成测试时间
    cout << dfs(useTime, dp, k - 1) << endl;  // 输出服务k的最早集成测试时间

    return 0;
}

题目分析

本题是一个图相关的问题,要求我们在给定服务启动依赖关系的情况下,求出某个服务在进行集成测试前,最少需要等待的时间。可以把这个问题看作是图的遍历问题,并且通过**深度优先搜索(DFS)**来解决。

解题思路

  1. 图的表示:每个服务可以看作一个节点,服务间的依赖关系可以看作有向边。服务启动时,如果依赖于其他服务,那么必须等待那些服务先启动完成。因此,这是一个典型的拓扑排序问题,求出某个服务的启动时间需要考虑它的所有依赖服务的启动时间。
  2. DFS(深度优先搜索):通过DFS遍历服务,计算每个服务启动的最早时间。为了避免重复计算,我们可以使用记忆化搜索来存储已计算过的服务的最早启动时间。
  3. 依赖关系处理:对于每个服务,我们需要遍历它所有依赖的服务,递归计算出依赖服务的启动时间,并将它们的最大时间加上该服务的启动加载时间,得到当前服务的最早集成测试时间。
  4. 最小等待时间:最后,通过DFS计算出服务k最早可以进行集成测试的时间。

代码大致描述

  1. 输入服务数量 n 和依赖矩阵 useTime
  2. 利用DFS遍历服务,通过递归的方式,计算服务k需要等待的最少时间。
  3. 对于每个服务,递归计算它的所有依赖服务的等待时间,并加上该服务自身的启动时间。
  4. 最终输出计算出的时间。

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

#面经##春招##C++##笔试##算法#
C++笔试真题题解 文章被收录于专栏

笔试真题题解

全部评论

相关推荐

03-17 12:07
已编辑
腾讯_CSIG_高级前端工程师
这里的经验主要针对计算机、信息类公司的面试,主要针对几个大厂:第一优先级:【整理你的简历】。这里就不分享经验了,网上到处都是经验。就一个简单的方法,在牛客上偷窥一个拿多个offer的大佬。有些大佬水群会把简历发出来,你就把他的简历copy下来,然后把内容替换成自己的,不要改格式。失败的简历多种多样,成功大佬的简历相差不大。这里主要是提醒下大家,网上很多骗钱的模版,这样那样花里胡哨的,实际上你的简历HR可能只用了2秒钟就筛完了。第二优先级:【背好面经】。一面大多都会问些面经,因为面试官有一项是考察面试者基础,简单问题没答上很容易触发必死裁决(学校越拉越要背好面经,因为你在面试阶段没有犯错的机会)。至于面经准备的丰富程度就看个人了,以前我面试的时候我室友说我在讲相声串口,很丝滑,但是并没有用,该j还是j。第三优先级:【准备好项目经历】。项目经历在面试眼中有个鄙视链:开源贡献/实习项目&nbsp;&gt;&nbsp;横向项目(校企合作)&nbsp;&gt;&nbsp;个人&nbsp;DIY项目。如果只有个人&nbsp;DIY&nbsp;的项目,没有更多可以写的,一定要把项目最后一公里走完,就是把项目部署到线上,用腾讯云免费的&nbsp;EdgeOne&nbsp;Pages(https://edgeone.ai/zh/products/pages),或者更加复杂的使用&nbsp;Cloudflare&nbsp;Worker。因为个人项目淘宝商城、仿网易云音乐等实在太多了,面试官早就不知道看了多少个,你自己弄一些动画效果或者优化项,如果可以部署体验,面试官可以很好的跟着你准备的东西走。如果你准备的项目他都没兴趣打开看一看的,随便问问,那么多半无了。第四优先级:【刷题】。刷题并不是不重要,而是这个不是几天可以快速解决的。一般来说有过ACM或者蓝桥杯经验的会好很多。我以前也是搞ACM的,有一点需要清楚面试做题上和大家刷题是不一样的。在别人盯着你,给你计时的情况下,还能冷静敲代码的人是很少的,一般需要有比赛经验。而且如果给你的题你没有准备到,多半没法现场思考解法的。特别是某些大厂还需要写完代码现场&nbsp;Accepted&nbsp;的,这真挺难的,建议大家早做准备。————这里补充一下八股面经和项目经历,一般有经验的面试官会结合起来一起问。这种情况下一定要去做项目部署、去引导话题,因为面试的大佬思维开始发散起来,在知识广度和深度上,校招生是很难跟得上,大家节奏一旦对不上多半要无。这里叫大家去部署项目就是让面试官玩起来,体验你的东西话题就聚焦了,如果强行不聚焦那么无了也就无了,说明对面要求就是特别高。这里叫用腾讯云的&nbsp;EdgeOne&nbsp;Pages部署是因为国内访问很快,如果你部署个项目卡得要死,面试官肯定问你优化或者网络相关的,也容易j。这里的优先级排序不是说重要性,在我看来都很重要,竞争这么激烈,一个没做好就无了。这里的优先级是一关一关过,简历排第一是因为简历没做好直接后面的都没了,无论你准备得多好。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务