2023 华为笔试题 华为海外笔试 0906

笔试时间:2023年9月6日 秋招

备注:第三题暂无题解

第一题

题目:设备按秩序组网的最大拓扑长度

在设备组网方法中,有一种按照一定秩序的组网方式,即设备的组网按照设备优先级顺序进行,最后组成一个线性拓扑。给定一组设备,设备包含组网优先级和时延,进行秩序组网后(按照优先级从小到大排序),输出线性拓扑中时延累加和小于等于目标值delay的最长子拓扑的长度。

概念约束:

a)子拓扑指线性拓扑连续的一段;

b) 最长子拓扑指的是拓扑中的设备数量最多的子拓扑;

c) 累加和是子拓扑中每个设备的时延之和;

d)优先按照优先级升序排序,其次按照时延升序排序;

输入描述

第一行是一个数组,第一个数字是数组长度,后面跟的是设备优先级数组元素,用整数表示。数组长度范围是[1, 100000],优先级范围是[1,100000];

第二行是一个数组,第一个数字是数组长度,后面跟的是设备时延数组元素,用整数表示,和第一行一一对应,时延范用是[1, 100000];

第三行是目标值。

输出描述

最长子拓扑长度,如果没有满足条件的,则返回0。

样例输入一

6 1 3 2 5 4 6

6 12 19 15 17 13 22

50

样例输出一

3

提示:

最长子拓扑12 15 19,因为其是满足条件的最长子拓扑,且和46最小,所以最长子拓扑是3。

排序后的数组:

12 3 4 5 6

12 15 19 13 17 22

样例输入二

4 1008 1005 1005 1000

4 32 33 33 25

16

样例输出二

0

提示:

没有满足条件的子拓扑。

排序后的数组:

1000 1005 1005 1008

25 33 33 32

参考题解

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.*;

class Main {
    static class Pair {
        int X, Y;

        public Pair(int X, int Y) {
            this.X = X;
            this.Y = Y;
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = 100004;
        Pair[] pa = new Pair[N];
        long[] s = new long[N];
        int n, d;

        n = scanner.nextInt();
        for (int i = 1; i <= n; i++) {
            pa[i] = new Pair(scanner.nextInt(), 0);
        }

        n = scanner.nextInt();
        for (int i = 1; i <= n; i++) {
            pa[i].Y = scanner.nextInt();
        }

        d = scanner.nextInt();
        Arrays.sort(pa, 1, n + 1, (a, b) -> Integer.compare(a.X, b.X));

        for (int i = 1; i <= n; i++) {
            s[i] = s[i - 1] + pa[i].Y;
        }

        int ans = 0;
        for (int r = 1, l = 0; r <= n; r++) {
            while (s[r] - s[l] > d) {
                l++;
            }
            ans = Math.max(ans, r - l);
        }

        System.out.println(ans);
    }
}

第二题

题目:套碗游戏

有一套塑料套碗的玩具,碗中间有个洞,可以从大到小套到一个固定在桌子的木棍上,对这些套碗编号1,2,...,n。我们把碗套到木棍后可以随时取出,但是取出的方式,只能是从木棍的上方取出,一次只能取出一个碗。那么就有可能会有多种套碗和取碗的顺序组合。现在问题是,给定套碗的个数,计算取碗的所有排列组合数,并且对于某一个给定的取碗顺序,确定是否可行。

输入描述

第一行:一个正整数,表示套碗的个数M,M的取值范围是[2,100];

第二行:取碗的序列,用空格分隔。

输出描述

第一行: 总共有多少种取碗方式;

第二行: 取碗的序列是否可行,是输出1,否输出0。

样例输入一

2

1 2

样例输出一

2

提示:

共有如下2种取碗方式:

2 1

1 2

样例输入二

3

3 1 2

样例输出二

5

提示:

共有如下5种取碗方式:

3 2 1

1 2 3

2 1 3

1 3 2

2 3 1

参考题解

贪心模拟入栈出栈。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    
    for (int 

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

2023 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论
第二题的第一小问有取巧的公式法,卡特兰公式,不过对笔试可能不友好,我刚刚好是笔试前不久看过汉诺塔问题的介绍记得的公式
点赞 回复
分享
发布于 2023-09-15 23:59 德国

相关推荐

2 7 评论
分享
牛客网
牛客企业服务