华为OD机试 - 银行插队 - 队列(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

某银行将客户分为了若干个优先级,1级最高,5级最低,当你需要在银行办理业务时,优先级高的人随时可以插队到优先级低的人的前面。

现在给出一个人员到来和银行办理业务的时间序列,请你每次银行办理业务时输出客户的编号。

如果同时有多位优先级相同且最高的客户,则按最先到来的顺序办理。

二、输入描述

输入第一行是一个正整数n,表示输入的序列中的事件数量。(1 ≤ n ≤ 500)

接下来有n行,每行第一个字符为a或p。

当字符为a时,后面会有两个正整数num和x,表示到来的客户编号为num,优先级为x;

当字符为p时,表示当前优先级最高的客户去办理业务。

三、输出描述

输出包含若干行,对于字符p,输出一行,仅包含一个正整数num,表示办理业务的客户编号。

四、测试用例

测试用例1:

1、输入

4
a 1 3
a 2 2
a 3 2
p

2、输出

2

3、说明

客户2和客户3都是优先级2,客户2先到达,因此输出2。

测试用例2:

1、输入

6
a 10 1
a 20 5
a 30 3
p
p
p

2、输出

10
30
20

3、说明

客户10优先级1
客户20优先级5
客户30优先级3
第一次’p’处理客户10(优先级最高)
第二次’p’处理客户30(优先级3高于优先级5)
第三次’p’处理客户20

五、解题思路

客户根据优先级(1级最高,5级最低)到达银行,并且高优先级的客户可以随时插队到低优先级客户的前面。当银行办理业务时,需要按照优先级从高到低的顺序处理客户,如果有多个客户具有相同的最高优先级,则按照他们到达的顺序先后处理。

  1. 事件处理:
    • 到达事件(‘a’):记录客户的编号和优先级,并将其加入相应优先级的队列中。
    • 办理业务事件(‘p’):从最高优先级开始,找到第一个非空的队列,取出最先到达的客户进行办理,并输出其编号。
  2. 数据结构选择:
    • 使用多个队列(每个优先级对应一个队列)来管理不同优先级的客户。
    • 采用数组来存储这些队列,方便根据优先级快速访问对应的队列。
  3. 算法流程:
    • 初始化5个队列,分别对应优先级1到5。
    • 遍历所有事件,根据事件类型进行相应处理。
    • 对于’p’事件,依次检查优先级从1到5的队列,找到第一个非空的队列,处理其中最先到达的客户。

六、Python算法源码

# 导入所需的库
from collections import deque
import sys

def main():
    # 读取输入的所有行
    input_lines = sys.stdin.read().splitlines()
    # 第一行是事件数量n
    n = int(input_lines[0])
    
    # 初始化5个队列,索引1到5分别对应优先级1到5
    priority_queues = [deque() for _ in range(6)]  # 索引0不使用
    
    # 遍历每一个事件
    for i in range(1, n + 1):
        # 获取当前事件的内容,并按空格分割
        parts = input_lines[i].strip().split()
        if parts[0] == 'a':
            # 到达事件,获取客户编号和优先级
            num = int(parts[1])
            priority = int(parts[2])
            # 将客户编号加入对应优先级的队列
            priority_queues[priority].append(num)
        elif parts[0] == 'p':
            # 办理业务事件,查找最高优先级的客户
            processed = False
            for p in range(1, 6):
                if priority_queues[p]:
                    # 取出队首客户并输出
                    customer = priority_queues[p].popleft()
                    print(customer)
                    processed = True
                    break
            if not processed:
                # 如果没有客户需要处理,输出提示信息
                print("No customers to process.")

if __name__ == "__main__":
    main()

七、JavaScript算法源码

// 使用 Node.js 的 readline 模块读取输入
const readline = require('readline');

// 创建接口
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    terminal: false
});

let inputLines = [];
let n = 0;
let currentLine = 0;

// 定义5个队列,索引1到5对应优先级1到5
let priorityQueues = [[], [], [], [], [], []]; // 索引0不使用

rl.on('line', function(line){
    inputLines.push(line);
}).on('close', function(){
    // 读取事件数量
    n = parseInt(inputLines[0]);
    
    // 处理每一个事件
    for(let i = 1; i <= n; i++){
        let parts = inputLines[i].trim().split(' ');
        if(parts[0] === 'a'){
            // 到达事件,获取客户编号和优先级
            let num = parseInt(parts[1]);
            let priority = parseInt(parts[2]);
            // 将客户加入对应优先级的队列
            priorityQueues[priority].push(num);
        }
        else if(parts[0] === 'p'){
            // 办理业务事件,查找最高优先级的客户
            let processed = false;
            for(let p = 1; p <=5; p++){
                if(priorityQueues[p].length > 0){
                    // 取出队首客户并输出
                    let customer = priorityQueues[p].shift();
                    console.log(customer);
                    processed = true;
                    break;
                }
            }
            if(!processed){
                // 如果没有客户需要处理,输出提示信息
                console.log("No customers to process.");
            }
        }
    }
});

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义队列节点结构体
typedef struct Node {
    int num; // 客户编号
    struct Node* next; // 指向下一个节点
} Node;

// 定义队列结构体
typedef struct Queue {
    Node* front; // 队首
    Node* rear;  // 队尾
} Queue;

// 初始化队列
void initQueue(Queue* q){
    q->front = q->rear = NULL;
}

// 判断队列是否为空
int isEmpty(Queue* q){
    return q->front == NULL;
}

// 入队操作
void enqueue(Queue* q, int num){
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->num = num;
    newNode->next = NULL;
    if(isEmpty(q)){
        q->front = q->rear = newNode;
    }
    else{
        q->rear->next = newNode;
        q->rear = newNode;
    }
}

// 出队操作,返回客户编号
int dequeue(Queue* q){
    if(isEmpty(q)){
        return -1; // 表示队列为空
    }
    Node* temp = q->front;
    int num = temp->num;
    q->front = q->front->next;
    if(q->front == NULL){
        q->rear = NULL;
    }
    free(temp);
    return num;
}

int main(){
    int n;
    // 读取事件数量
    scanf("%d", &n);
    // 初始化5个队列,索引1到5对应优先级1到5
    Queue priorityQueues[6]; // 索引0不使用
    for(int i=1;i<=5;i++){
        initQueue(&priorityQueues[i]);
    }
    // 读取剩余的换行符
    getchar();
    // 处理每一个事件
    for(int i=0;i<n;i++){
        char line[100];
        fgets(line, sizeof(line), stdin);
        // 去除末尾换行符
        line[strcspn(line, "\n")] = 0;
        if(line[0] == 'a'){
            int num, priority;
            // 解析客户编号和优先级
            sscanf(line + 2, "%d %d", &num, &priority);
            // 将客户加入对应优先级的队列
            enqueue(&priorityQueues[priority], num);
        }
        else if(line[0] == 'p'){
            // 办理业务事件,查找最高优先级的客户
            int processed = 0;
            for(int p=1;p<=5;p++){
                if(!isEmpty(&priorityQueues[p])){
                    int customer = dequeue(&priorityQueues[p]);
                    printf("%d\n", customer);
                    processed = 1;
                    break;
                }
            }
            if(!processed){
                // 如果没有客户需要处理,输出提示信息
                printf("No customers to process.\n");
            }
        }
    }
    // 释放内存(可选,此处略)
    return 0;
}

九、C++算法源码

#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

int main(){
    int n;
    // 读取事件数量
    cin >> n;
    cin.ignore(); // 忽略剩余的换行符
    
    // 初始化5个队列,索引1到5对应优先级1到5
    vector<queue<int>> priorityQueues(6, queue<int>()); // 索引0不使用
    
    // 处理每一个事件
    for(int i=0;i<n;i++){
        string line;
        getline(cin, line);
        // 使用字符串流解析
        stringstream ss(line);
        string type;
        ss >> type;
        if(type == "a"){
            int num, priority;
            ss >> num >> priority;
            // 将客户加入对应优先级的队列
            priorityQueues[priority].push(num);
        }
        else if(type == "p"){
            // 办理业务事件,查找最高优先级的客户
            bool processed = false;
            for(int p=1;p<=5;p++){
                if(!priorityQueues[p].empty()){
                    int customer = priorityQueues[p].front();
                    priorityQueues[p].pop();
                    cout << customer << endl;
                    processed = true;
                    break;
                }
            }
            if(!processed){
                // 如果没有客户需要处理,输出提示信息
                cout << "No customers to process." << endl;
            }
        }
    }
    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值