华为笔试 华为笔试题 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打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南