华为笔试 华为笔试题 0521

笔试时间:2025年5月21日

第一题:开发一个简单任务调度系统

优先级任务会抢占低优先级任务。当你完成位务能执行。同等优先级任务执行。同等优先级的任务,按照小优先级越高。只有高优先级任务执行完成后,低优先级任务才能执行。同等优先级任务才能执行。同等优先级的任务,高优先级任务会抢占低优先级任务。你需要开发一个简单的任务调度系统,该系统按任务优先调度。当低优先级任务执行时,如新增了高优先级任务,高程序需要完成以下功能:请你实现一个程序,模拟这个任务调度系统。添加任务:将一个新任务添加到任务调度系统。任务包含一个唯一ID(task_id)、优先级(priority)[0,99],运行时间(time)[1,10000]。执行任务:任务调度系统按照调度策略,调度任务并执行。调度系统调度任务,并消耗对应时间片,时间片范围[1,100000]。

输入描述

程序需要处理以下类型的输入:

添加任务:add task_id priority time

执行任务:run time

注:输入命令总行数不超过10000行run命令可以有多个空行即命令结束

输出描述

显示任务调度系统当前执行的任务ID。若无任何任务,则显示idle。

样例输入

add 10 1 0

add 20 1 3

add 30 0 1

run 11

样例输出

20

解释:add 10 1 0:添加任务10,其优先级为1,运行时间为0个时间片add 20 1 3:添加任务20,其优先级为1,运行时间为3个时间片add 30 0 1:添加任务30,其优先级为0,运行时间为1个时间片run 11:调度系统运行11个时间片。首先调度任务20(优先级1),运行3个时间片后任务完成;接着调度任务30(优先级0),运行1个时间片后任务完成;剩余7个时间片无任务可运行,输出idle(但实际输出为20,可能与解释矛盾)。

参考题解

队列模拟。

C++:

#include <bits/stdc++.h>
using namespace std;

struct Task {
    int task_id;
    int priority;
    int time;
    int seq;  // 用于区分插入顺序

    Task(int tid, int pri, int t, int s)
        : task_id(tid), priority(pri), time(t), seq(s) {}
};

// 优先级队列比较器:优先 priority 小,其次 seq 小
struct TaskCompare {
    bool operator()(const Task &a, const Task &b) const {
        if (a.priority != b.priority)
            return a.priority > b.priority;
        return a.seq > b.seq;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    priority_queue<Task, vector<Task>, TaskCompare> pq;
    string line;
    int seq_counter = 0;

    while (true) {
        if (!getline(cin, line)) break;
        if (line.empty()) break;

        istringstream iss(line);
        string cmd;
        iss >> cmd;
        if (cmd == "add") {
            int tid, pri, t;
            iss >> tid >> pri >> t;
            pq.emplace(tid, pri, t, seq_counter++);
        }
        else if (cmd == "run") {
            int run_time;
            iss >> run_time;
            int executed = 0;
            vector<Task> buffer;
            while (!pq.empty() && executed < run_time) {
                Task cur = pq.top(); pq.pop();
                int dt = min(cur.time, run_time - executed);
                cur.time -= dt;
                executed += dt;
                if (cur.time > 0)
                    buffer.push_back(cur);
            }
            // 将未完成任务放回队列
            for (auto &tk : buffer)
                pq.push(tk);
        }
    }

    if (pq.empty()) {
        cout << "idle\n";
    } else {
        cout << pq.top().task_id << "\n";
    }

    return 0;
}

Java:

import java.util.*;

public class TaskScheduler {
    static class Task implements Comparable<Task> {
        int taskId;
        int priority;
        int time;
        int seq;  // 插入顺序

        Task(int taskId, int priority, int time, int seq) {
            this.taskId = taskId;
            this.priority = priority;
            this.time = time;
            this.seq = seq;
        }

        @Override
        public int compareTo(Task other) {
            if (this.priority != other.priority) {
                return Integer.compare(this.priority, other.priority);
            }
            return Integer.compare(this.seq, other.seq);
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        PriorityQueue<Task> pq = new PriorityQueue<>();
        int seqCounter = 0;

        while (sc.hasNextLine()) {
            String line = sc.nextLine().trim();
            if (line.isEmpty()) break;

            String[] parts = line.split("\\s+");
            String cmd = parts[0];
            if ("add".equals(cmd)) {
                int taskId = Integer.parseInt(parts[1]);
                int priority = Integer.parseInt(parts[2]);
                int time = Integer.parseInt(parts[3]);
                pq.offer(new Task(taskId, priority, time, seqCounter++));
            } else if ("run".equals(cmd)) {
                int runTime = Integer.parseInt(parts[1]);
                int executed = 0;
                List<Task> buffer = new ArrayList<>();
                while (!pq.isEmpty() && executed < runTime) {
                    Task cur = pq.poll();
                    int dt = Math.min(cur.time, runTime - executed);
                    cur.time -= dt;
                    executed += dt;
                    if (cur.time > 0) {
                        buffer.add(cur);
                    }
                }
                // 将剩余任务放回队列
                for (Task t : buffer) {
                    pq.offer(t);
                }
            }
        }

        if (pq.isEmpty()) {
            System.out.println("idle");
        } else {
            System.out.println(pq.peek().taskId);
        }
        sc.close();
    }
}

Python:

import heapq

class Task:
    def __init__(self, task_id, priority, time, id):
        self.task_id = task_id
        self.priority = priority
        self.time = time
        self.id = id

    def __lt__(self, other):
        if self.priority != other.priority:
            return self.priority < other.priority
        return self.id < other.id

task_queue = []

def add_task(task_id, priority, time):
    new_task = Task(task_id, priority, time, len(task_queue))
    heapq.heappush(task_queue, new_task)

def run_task(time):
    global task_queue
    executed_time = 0
    while task_queue and executed_time < time:
        current_task = heapq.heappop(task_queue)
        execute_time = min(current_task.time, time - executed_time)
        current_task.time -= execute_time
        executed_time += execute_time
        if current_task.time > 0:
            heapq.heappush(task_queue, current_task)

while True:
    try:
        command = input().strip()
        if not command:
            break
        parts = command.split()
        if parts[0] == "add":
            task_id, priority, time = int(parts[1]), int(parts[2]), int(parts[3])
            add_task(task_id, priority, time)
        elif parts[0] == "run":
            time = int(parts[1])
            run_task(time)

    except:
        break

if task_queue:
    print(f"{task_queue[0].task_id}")
else:
    print("idle")

第二题:地震救灾线路

某市发生地震,为了尽快将救援物质输送到受灾乡镇,需要你设计出从救援物质集结点(有且仅有一个)到某一个受灾乡镇的最短线路。 应急部门通过无人机勘察了受灾地区地形,提供了各乡镇之间以及乡镇到救援物质集结点的距离,请你算出救援物质集结点到受灾乡镇到救援。

输入描述

第一行,N,受灾乡镇个数,3<=N<=20 第二行至第N+2行,救援物质集结点以及各乡镇之间的距离矩阵(即N+1个节点之间的相互距离矩阵),距离取值范围是[0,100]。序号0的节点表示救援物质集结点,序号1 ~ N的节点表示各个受灾乡镇。0表示两个节点不相邻。 第N+3行,m,要抵达的乡镇序号(范围1~N)

输出描述

从物质集结点(节点0)到乡镇m(节点m)的最短路径长度

样例输入

5

0 5 13 0 0 0

5 0 12 0 75 0

13 12 0 25 0 0

0 0 25 0 35 20

0 75 0 35

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

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 11:33
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 12:04
毕业生招你惹你了,问一个发薪日来一句别看网上乱七八糟的你看哪个工作没有固定发薪日扭头就取消了面试就问了一句公司都是这个态度吗还搞上人身攻击了...
程序员小白条:呃呃呃,都还没面试,我都不会问这么细,何况通不通过,去不去都另说,你没实力和学历的话,在外面就这样,说实话没直接已读不回就不错了,浪费时间基本上
点赞 评论 收藏
分享
陈逸轩1205:才105 哥们在养生呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务