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

news2024/10/8 12:51:53

在这里插入图片描述

华为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在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端vue-安装pinia,它和vuex的区别

创建一个store的目录&#xff0c;任意一个js文件&#xff0c;再导入pinia&#xff0c;再定义

想走?可以!先买票——迭代器模式

文章目录 想走&#xff1f;可以&#xff01;先买票——迭代器模式乘车买票&#xff0c;不管你是谁&#xff01;迭代器模式迭代器实现Java的迭代器实现迭代高手 想走&#xff1f;可以&#xff01;先买票——迭代器模式 乘车买票&#xff0c;不管你是谁&#xff01; 时间&#…

【2024版】最新kali linux入门及常用简单工具介绍(非常详细)零基础入门到精通,收藏这一篇就够了_kalilinux

一、介绍 kali Linux Kali Linux 是一个基于 Debian 的 Linux 发行版&#xff0c;主要用于数字取证和渗透测试。它预装了大量的安全审计和渗透测试工具&#xff0c;被广泛应用于网络安全领域。 &#xff08;一&#xff09;特点 工具丰富&#xff1a;集成了数百种用于渗透测试…

越差越好?为什么简单反而赢了,这背后究竟有什么秘诀?

你有没有发现,软件界里那些最成功的产品,往往并不是最复杂、最强大的?我们用的很多东西,看起来功能普通,甚至有些粗糙,但就是这样简陋的设计,反而成了市场上的赢家。 也许你玩过Flappy Bird这个游戏:它的设计非常简单,玩家只需要点击屏幕让小鸟飞行,避开管道障碍。游…

知名开发工具RubyMine全新发布v2024.2——增加浏览器保护的代码洞察

RubyMine 是一个为Ruby 和 Rails开发者准备的 IDE&#xff0c;其带有所有开发者必须的功能&#xff0c;并将之紧密集成于便捷的开发环境中。 立即获取RubyMine v2024.2正式版 具体更新详情如下&#xff1a; Rails 对Kamal配置文件的补全 RubyMine现在为 Kamal 配置文件提供…

代码随想录算法训练营Day28 | 39. 组合总和、40.组合总和Ⅱ、131.分割回文串

目录 39. 组合总和 40.组合总和Ⅱ 131.分割回文串 39. 组合总和 题目 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不…

Pytorch实现CNN实验

一、实验要求 用 python 的 Pytorch模块实现卷积神经网络。网络结构为一个输入层、两个卷积层、一个全连接层、一个输出层。 二、实验目的 实现一个包含卷积层、池化层和全连接层的卷积神经网了解如何在训练数据集上使用反向传播算法和Adam优化算法训练神经网络。加深对卷积…

国外电商系统开发-运维系统文件上传-高级上传

如果您要上传文件到10台服务器中&#xff0c;有3台服务器的路径不是一样的&#xff0c;那么在这种情况下您就可以使用本功能&#xff0c;单独执行不一样的路径 点击【高级】上传

雷池+frp 批量设置proxy_protocol实现真实IP透传

需求 内网部署safeline&#xff0c;通过frp让外网访问内部web网站服务&#xff0c;让safeline记录真实外网攻击IP safeline 跟 frp都部署在同一台服务器&#xff1a;192.168.2.103 frp client 配置 frpc只需要在https上添加transport.proxyProtocolVersion "v2"即…

【星汇极客】STM32 HAL库+CubeMX开发之用户代码规范(持续更新)

前言 本人是一名嵌入式学习者&#xff0c;在大学期间也参加了不少的竞赛并获奖&#xff0c;包括&#xff1a;江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

ComfyUI 实战教程:古人画像变真人

最近看到一种古画变真人的效果&#xff0c;就是将书上的古人画像重绘为真人&#xff0c;效果炸裂&#xff0c;不敢独享&#xff0c;特别分享给大家。 效果演示 废话不多说&#xff0c;还是先看效果。大家可以猜猜它们都是谁&#xff5e; 使用方法 这个方法在 Stable Diffusi…

斩获ICDAR历史地图OCR比赛冠军:我们如何处理密集旋转交叉文本?

ICDAR 比赛简介 ICDAR 比赛 https://rrc.cvc.uab.es/是国际公认的文字领域权威的比赛&#xff0c;文字领域顶会论文里的数据测评和测评指标往往都来源于ICDAR比赛的数据和指标&#xff0c;每年一般会有几个大类的赛事&#xff0c;然后每个赛事会细分3-4个比赛。ICDAR竞赛因其极…

APP未上架开通微信支付流程分享

在移动互联网时代&#xff0c;支付功能的便捷性对于APP的成功至关重要。即便APP尚未上架至应用商店&#xff0c;开发者仍可以提前开通微信支付功能&#xff0c;以便进行内部测试、预售活动或特定场景下的支付需求。本文将详细介绍APP未上架时如何开通微信支付的流程&#xff0c…

74.【C语言】文件操作(1)

目录 1.进行文件操作的原因 销毁的示例 2.文件的类型 1.操作文件的步骤 2.文件名 3.查看文件路径的方法 方法1 方法2 方法3 4.数据文件的介绍 举例 ① ASCII码的形式(即字符形式)存储 01.手动写入数据 02.用程序写入数据 ②二进制形式存储 理解"不加转换&…

技术美术百人计划 | 《5.4 水体渲染》笔记

一、水体渲染的波形模拟技术-基于物理 基于物理的波形模拟方法&#xff1a; 欧拉方法&#xff08;Eulerian approaches&#xff09;[Kass 1990]拉格朗日方法&#xff08;Lagrangian approaches&#xff09; [Stam 1995]欧拉-拉格朗日混合方法&#xff08;Hybrid approaches&a…

想有独立站但是不知道怎么建站,自助/外包建站怎么选?

绝大多数外贸人和电商人都会有一个疑问&#xff0c;那就是选择自助建站还是外包建站更好——我个人觉得吧&#xff0c;这两个选择主要取决于时间&#xff0c;技术能力&#xff0c;预算还有你的具体需求。 自助建站 比如自助建站&#xff0c;它就更适合预算有限、需求较简单且…

ComfyUI增强图像细节只需要一个节点(附工作流),SD1.5、SDXL、FLUX.1 全支持,简单好用!

今天给小伙伴们介绍一个非常简单&#xff0c;但又相当好使的一个插件。 功能很简单&#xff0c;就是增加或者减少图像的细节&#xff0c;节点也很简单&#xff0c;就一个节点&#xff0c;只需要嵌入我们的 ComfyUI 的基础工作流中就可以了&#xff0c;随插随用。 而且该插件不…

GPT系列

GPT&#xff08;Generative Pre-Training&#xff09;&#xff1a; 训练过程分两步&#xff1a;无监督预训练有监督微调 模型结构是decoder-only的12层transformer 1、预训练过程&#xff0c;窗口为k&#xff0c;根据前k-1个token预测第k个token&#xff0c;训练样本包括700…

一文带大家快速上手SQLAlchemy 对数据的增删改查操作

SQLAlchemy SQLAlchemy“采用简单的Python语言&#xff0c;为高效和高性能的数据库访问设计&#xff0c;实现了完整的企业级持久模型”。SQLAlchemy的理念是&#xff0c;SQL数据库的量级和性能重要于对象集合。我们可以使用Flask和SQLAlchemy的数据库访问层&#xff08;DAL&…

别人苦画流程图一小时,我却瞬间搞定12 种图表!

在AI写作中&#xff0c;如何才能生成各种图表呢&#xff1f;例如流程图、序列图、甘特图等&#xff0c;今天就来教你如何生成。 本文阅读难度&#xff1a;★☆☆☆☆ 在商业、学术场景中&#xff0c;经常需要画流程图&#xff0c;手工画的话至少得1个小时才能完画&#xff0c…