【2024-01-24】华为秋招笔试两道编程题解

恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经。
作者@TechGuide【全网同名】

订阅专栏【进阶版】2023最新大厂笔试真题 & 题解,不容错过的宝藏资源!

第一题:玻璃球计分

题目描述

小盖有根绳子,上面穿了很多玻璃球,玻璃球由红绿蓝二种颜色组成,其中红色球1分,绿色球2分,蓝色球3分,现在对同颜色连在一起的球有一个积分奖励规则当这个球与前面1个球颜色相同会给此球奖励1分,当这个球与前面2个球的颜色都相同会给此球奖励2分,以此类推,当这个球与前面3个球的颜色都相同会给此球奖励3分。

现在请从前往后计算这串玻璃球的累计分数。其中红色玻璃球用字符r表示,绿色玻璃球用字符g表示,蓝色玻璃球用字符b 表示

输入描述

1个string由r、g、b组成的字符串

1<=string.length<=10000

输出描述

经过计算后的得分

样例

输入

rgb

输出

6

样例说明

1+2+3=6

思路

模拟,思路很简单,就是遍历字符串,对于当前字符,判断与前一个字符是否相同,如果相同就更新计数器,累加得分;如果不相同,就重置计数器,更新前一个字符,再计算得分。

代码

Java版本

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        char prec = 'a';
        int cnt = 0, res = 0;

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == prec) {
                cnt++;
                res += (c == 'r') ? 1 + cnt : (c == 'g') ? 2 + cnt : 3 + cnt;
            } else {
                cnt = 0;
                prec = c;
                res += (c == 'r') ? 1 : (c == 'g') ? 2 : 3;
            }
        }

        System.out.println(res);
    }
}
// vx公众号关注TechGuide,代码可能需要少量调试。

CPP版本

#include 
using namespace std;

int main() {
    string s;
    cin >> s;
    char prec = 'a';
    int cnt = 0, res = 0;

    for (int i = 0; i < s.length(); i++) {
        char c = s[i];
        if (c == prec) {
            cnt++;
            res += (c == 'r') ? 1 + cnt : (c == 'g') ? 2 + cnt : 3 + cnt;
        } else {
            cnt = 0;
            prec = c;
            res += (c == 'r') ? 1 : (c == 'g') ? 2 : 3;
        }
    }

    cout << res << endl;
    return 0;
}
// vx公众号关注TechGuide,代码可能需要少量调试。

第二题:大模型训练

题目描述

AI大模型学习大量的训练样本,通过大量参数拟合出样本背后复杂的高维概率密度分布关系。由于训练数据量越来越大,参数越来越多,模型越来越大,传统超级计算机算力和资源有限无法满足训练需求,假设可通过量了计算机来进行人模型训练现有简化后训练了任务模型列表 tasks, tasks[i] 表示第 i个子任务模型的算力需求,为了保证模型计算的SLA要求所有的子任务模型在T个时刻内完成计算。

每个时刻,需按照给出子任务模型的算力需求列表( tasks )顺序调度到量了计算机并完成计算。任意时刻调度的多个了任务模型的算力需求总和不会超过量了计算机可承载的最人算力负荷请返回量了计算机需要提供的最低算力,可在T个时刻内计算完全部子任务模型。

输入描述

输入包括两行,第一行包含2个整数N,T,分别表示子任务模型列表长度,计算全部了任务模型的时刻要求第二行包含N个整数: tasks[1] tasks[2] tasks[3]… tasks[n] 分别表示第 i个子任务模型的算力需求。

注意:

(1) 1 <= T <= N <= 50000

(2) 1 <= tasks[i] <= 500

输出描述

输出一行,包含一个整数,表示量了计算机需要提供的。

最低算力,可在T个时刻内计算完全部子任务模型。

样例

输入

10 5
1 2 3 4 5 6 7 8 9 10

输出

15

样例说明

量子计算机需要提供的最低算力15,能够满足5个时刻内计算全部子任务模型的需要:时刻1: 1,2.3,4,5;时刻2: 6,7: 时刻3: 8: 时刻4: 9: 时刻5: 10。

思路

二分查找,计算在给定时间内完成所有子任务模型所需的最低计算能力。

代码

Java版本

import java.util.Scanner;

public class QuantumComputer {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int N = scanner.nextInt();
        int T = scanner.nextInt();

        int[] tasks = new int[N];
        for (int i = 0; i < N; i++) {
            tasks[i] = scanner.nextInt();
        }

        int l = 1, r = 500 * 50000;

        while (l < r) {
            int mid = (l + r) >> 1;
            if (check(tasks, T, mid)) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }

        System.out.println(r);
    }

    private static boolean check(int[] tasks, int T, int x) {
        int cnt = 1, sum = 0;
        for (int r = 0; r < tasks.length; r++) {
            if (sum + tasks[r] <= x) {
                sum += tasks[r];
            } else {
                cnt++;
                sum = tasks[r];
            }
        }
        return cnt <= T;
    }
}
// vx公众号关注TechGuide,代码可能需要少量调试。

CPP版本

#include 
#include 
#include 

using namespace std;

bool check(const vector<int>& tasks, int T, int x) {
    int cnt = 1, sum = 0;
    for (int r = 0; r < tasks.size(); r++) {
        if (sum + tasks[r] <= x) {
            sum += tasks[r];
        } else {
            cnt++;
            sum = tasks[r];
        }
    }
    return cnt <= T;
}

int main() {
    int N, T;
    cin >> N >> T;

    vector<int> tasks(N);
    for (int i = 0; i < N; i++) {
        cin >> tasks[i];
    }

    int l = 1, r = 500 * 50000;

    while (l < r) {
        int mid = (l + r) >> 1;
        if (check(tasks, T, mid)) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }

    cout << r << endl;

    return 0;
}
// vx公众号关注TechGuide,代码可能需要少量调试。

你可能感兴趣的:(大厂笔试真题解析,华为,算法)