华为嵌入式软件开发工程师笔试4-26

公号:嵌入式未来

《嵌入式软件开发笔试与面试手册》https://blog.nowcoder.net/zhuanlan/jvN8gj

《嵌入式软件笔试-2023年真题汇总》https://blog.nowcoder.net/zhuanlan/0oDWVm

1、批量初始化次数

某部门在开发一个代码分析工具,需要分析代码模块之间的依赖关系,用来确定模块的初始化顺序、是否有循环依赖等问题。“批量初始化”是指一次可以初始化一个或多个模块。例如模块1依赖模块2,模块3也依模块2,但模块13没有依赖关系。则必须先“批量初始化”模块2,再“批量初始化”模块13。现给定一组模块间的依赖关系,请计算需要“批量初始化”的次数。

输入

(1)1行只有一个数字表示模块总数N

(2)随后的N行依次表示模块1N的依赖数据。每行的第1个数据表示依赖的模块数量(不会超过N),之后的数字表示当前模块依赖的模块ID序列,该序列不会重复出现相同的数字,模块ID的取值一定在[1,N]之内。

(3)模块总数N取值范围1<=N<=1000

(4)每一行里面的数字按1个空格分隔

输出

输出“批量初始化次数”若有循环依赖无法完成初始化,则输出-1

样例1

输入:

5

3 2 3 4

1 5

1 5

1 5

0

输出:

3

解释:5个模块。模块1依赖模块234;模块2依赖模块5;模块3依赖模块5:模块4依赖模块5;模块5没有依赖任何模块.

批量初始化顺序为{5}->{2,3,4}->{1},共需“批量初始化”3.

#include <iostream>
#include <vector>
#include <queue>

int main() {
    int n;
    std::cin >> n;

    std::vector<std::vector<int>> graph(n + 1);
    std::vector<int> indegree(n + 1, 0);

    for (int i = 1; i <= n; ++i) {
        int dep_count;
        std::cin >> dep_count;
        while (dep_count--) {
            int dep;
            std::cin >> dep;
            graph[dep].push_back(i);
            ++indegree[i];
        }
    }

    std::queue<int> q;
    for (int i = 1; i <= n; ++i) {
        if (indegree[i] == 0) {
            q.push(i);
        }
    }

    int batch_init_count = 0;
    while (!q.empty()) {
        ++batch_init_count;
        int level_size = q.size();
        while (level_size--) {
            int cur = q.front();
            q.pop();
            for (int next : graph[cur]) {
                --indegree[next];
                if (indegree[next] == 0) {
                    q.push(next);
                }
            }
        }
    }

    for (int i = 1; i <= n; ++i) {
        if (indegree[i] != 0) {
            std::cout << -1 << std::endl;
            return 0;
        }
    }

    std::cout << batch_init_count << std::endl;
    return 0;
}

2、分配资源ID

给定一个管理ID的资源池,可以从资源池中分配资源ID和释放资源ID,分配方式有动态分配和指定分配,动态分配是从资源池的开始分配一个资源ID,指定分配是指定一个资源ID进行分配,无论哪种分配方式释放资源ID时都需要放到资源池的尾部。执行一系列操作后,请问资源池的第一个空闲资源ID应该是多少?

注意:

资源池的初始顺序是从小到大。资源池中空闲资源ID不足时,动态分配失败,对资源池不进行任何操作指定分配资源ID已经被占用或者不在资源池范围内时,对资源池不进行任何操作。

释放资源ID不在资源池范围内时或者已经是空闲资源ID时,对资源池不进行任何操作。保证每个用例最后都有空闲资源ID

输入

第一行是资源池的范围;

第二行是操作个数。

第三行开始,第一个数字代表操作类型,1表示动态分配,2表示指定分配,3表示释放;

如果第一个数字是1,第二个表示分配的个数;

如果第一个数字是2,第二个表示分配的资源ID;

如果第一个数字是3,第二个表示释放的资源ID

输出

资源池的第一个空闲资源ID

样例1

输入:

1 3

2

1 1

3 1

输出:

2

解释:第一行资源池范围是[1,3],资源池的初始顺序是1->2->3

第二行操作个数有2个。

第三行动态分配1个资源ID,资源池中剩余的资源ID顺序是2->3

第四行释放1个资源ID,资源ID1,资源池中剩余的资源ID顺序是2->3->1

执行以上操作后,资源池的第一个空闲资源ID2

样例2

输入:

1 3

3

2 2

3 2

1 1

输出:

3

解释:第一行资原池范围是[1,3],资源池的初始顺序是1->2->3

第二行操作个数有3个。

第三行指定分配1个资源ID,资源ID2,资源池中剩余的资源ID顺序是1->3.

1IDID2ID1->3->2.

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏主要发布嵌入式软件开发相关岗位2023年(2024届)的笔试真题(嵌入式软件开发、通用软件开发、C/C++软件开发、算法工程师、数据开发、测试开发等)主要是算法编程题,其中一些岗位笔试含有对应的选择题、填空题、简单题。

全部评论
mark
点赞 回复 分享
发布于 2023-05-10 11:38 广东
m
点赞 回复 分享
发布于 2023-05-10 15:24 广东
m
点赞 回复 分享
发布于 2023-05-11 12:03 广东
m
点赞 回复 分享
发布于 2023-05-11 18:38 广东

相关推荐

oppo 应用软开 22*15+0.5*12
拿到了ssp完美:真的坎坷,但是你至少拿到这么多offer了!
点赞 评论 收藏
分享
无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
牛客737698141号:他们可以看到在线简历的。。。估计不合适直接就拒了
点赞 评论 收藏
分享
评论
4
12
分享
牛客网
牛客企业服务