华为OD机考-模拟消息队列(C,python)

2023-11-09

题目描述:

让我们来模拟一个消息队列的运作;有一个发布者和若干消费者;发布者会在给定的时刻向消息队列发送消息;

*若此时消息队列有消费者订阅;这个消息会被发送到订阅的消费者中优先级最高(输入中消费者按优先级升序排列)的一个;

*若此时没有订阅的消费者,该消息被消息队列丢弃。

消费者则会在给定的时刻订阅消息队列或取消订阅。

*当消息发送和订阅发生在同一时刻时,先处理订阅操作,即同一时刻订阅的消费者成为消息发送的候选。

*当消息发送和取消订阅发生在同一时刻时,先处理取消订阅操作,即消息不会被发送到同一时刻取消订阅的消费者。

输入描述:

输入为两行。

第一行为2N个正整数,代表发布者发送的N个消息的时刻和内容(为方便解折,消息内容也用正整数表示)。第一个数字是第一个消息的发送时刻,第二个数字是第一个消息的内容,以此类推。用例保证发送时刻不会重复,但注意消息并没有按照发送时刻排列。

第二行为2M个正整数,代表M个消费者订阅和取消订阅的时刻。第一个数字是第一个消费者订阅的时刻,第二个数字是第一个消费者取消订阅的时刻,以此类推。用例保证每个消费者的取消订阅时刻大于订阅时刻,消费者按优先级升序排列。

两行的数字都由空格分隔。N不超过100,M不超过10,每行的长度不超过1000字符。

输出描述:

输出为M行,依次为M个消费者收到的消息内容,消息内容按收到的顺序排列,且由空格分隔;

若某个消费者没有收到任何消息,则对应的行输出-1.

测试用例1:

输入:

2 22 1 11 4 44 5 55 3 33

1 7 2 3

输出:

11 33 44 55

22

说明:消息11在1时刻到达,此时只有第一个消费者订阅,消息发送给它;

消息22在2时刻到达,此时两个消费者都订阅了,消息发送给优先级最高的第二个消费者;

消息33在时刻3到达,此时只有第一个消费者订阅,消息发送给它;

余下的消息按规则也是发送给第一个消费者。

测试用例2:

输入:

5 64 11 64 9 97

9 11 4 9

输出:

97

64

说明:

消息64在5时刻到达,此时只有第二个消费者订阅,消息发送给它;

消息97在9时刻到达,此时只有第一个消费者订阅(因为第二个消费者刚好在9时刻取消订阅),消息发送给它;

11时刻也到达了一个内容为64的消息,不过因为没有消费者订阅,消息被丢弃。

解题思路:

1、消息按照到达的时刻排序;

2、查询每条消息,按照优先级顺序是否到达(反向遍历),如果在消费者订阅,并未取消订阅存入数组;

3、判断消息达到时刻是否满足消费者要求,满足收集打印。

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

#define N_MAX 100
#define M_MAX 10

int analysis(char *str,int (*arr)[2]){
    int len = strlen(str);
    char *temp_str = (char *)malloc(sizeof(char)*5);
    int cnt = 0,num = 0,arr_cnt = 0;
    temp_str = strtok(str," ");
    while(temp_str != NULL){
        num = atoi(temp_str);
        if(cnt % 2 == 0){
            arr[arr_cnt][0] = num;
        }else{
            arr[arr_cnt++][1] = num;
        }
        cnt++;
        temp_str = strtok(NULL," ");
    }
    free(temp_str);
    return arr_cnt;
}

int cmp(const void *a,const void *b){
    int *arr1 = *(int **)a;
    int *arr2 = *(int **)b;
    int wa = arr1[0];
    int wb = arr2[0];
    return wa - wb;

}

int main(){
    // int news[N_MAX][2],news_cnt;
    int **news = (int **)malloc(sizeof(int *)*N_MAX);
    int news_cnt = 0;
    int consumer[M_MAX][2],consumer_cnt;
    char news_str[500];
    char consumer_str[100];
    fgets(news_str,500,stdin);
    fgets(consumer_str,100,stdin);
    //把消息与消费者订阅消息解析,存储进2维数组
    char *temp_str = (char *)malloc(sizeof(char)*5);
    int cnt = 0,num = 0;
    temp_str = strtok(news_str," ");
    while(temp_str != NULL){
        num = atoi(temp_str);
        if(cnt % 2 == 0){
            news[news_cnt] = (int *)malloc(sizeof(int)*2);
            news[news_cnt][0] = num;
        }else{
            news[news_cnt++][1] = num;
        }
        cnt++;
        temp_str = strtok(NULL," ");
    }
    free(temp_str);
    consumer_cnt = analysis(consumer_str,consumer);
    //消息按照到达的时刻排序
    qsort(news,news_cnt,sizeof(int*),cmp);
    //定义存储消费者收到消息内容
    int output[consumer_cnt][N_MAX];
    //定义消费者收到消息内容的数量
    int output_cnt[consumer_cnt];
    memset(output_cnt,0x00,sizeof(int)*consumer_cnt);
    //遍历每条消息
    for(int i = 0;i < news_cnt;i++){
        //查询每条消息,按照优先级顺序是否到达(反向遍历),如果在消费者订阅,并未取消订阅存入数组
        for(int j = consumer_cnt - 1;j >= 0;j--){
            //判断消息达到时刻是否满足消费者要求
            if(news[i][0] >= consumer[j][0] && news[i][0] < consumer[j][1]){
                //消息存入前面定义消费者的收到消息数组
                output[j][output_cnt[j]++] = news[i][1];
                break;
            }
        }
    }
    //逐个打印消费者储存的消息
    for(int i = 0;i < consumer_cnt;i++){
        if(output_cnt[i] == 0){
            printf("-1\n");
        }else{
            for(int j = 0;j < output_cnt[i];j++){
                printf("%d ",output[i][j]);
            }
            printf("\n");
        }
    }
}

Python代码

news = list(map(int,input().split()))
consumers = list(map(int,input().split()))
news_list = []
consumers_list = []
for i in range(0,len(news),2):
    news_list.append([news[i],news[i+1]])
for i in range(0,len(consumers),2):
    consumers_list.append([consumers[i],consumers[i+1]])
#消息按照到达时刻排序
news_list.sort(key=lambda x: x[0])
#定义消费者收到消息内容的数量
res_list = []
for i in range(len(consumers_list)):
    res_list.append([])
#遍历每条消息
for i in range(len(news_list)):
    #查询每条消息,按照优先级顺序是否到达(反向遍历),如果在消费者订阅,并未取消订阅存入数组
    for j in range(len(consumers_list),0,-1):
        #判断消息达到时刻是否满足消费者要求
        if consumers_list[j - 1][0] <= news_list[i][0] < consumers_list[j - 1][1]:
            res_list[j - 1].append(news_list[i][1])
            break
#逐个打印消费者消息
for contents in res_list:
    if len(contents) == 0:
        print("-1")
    else:
        print(" ".join(map(str, contents)))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

华为OD机考-模拟消息队列(C,python) 的相关文章

  • 推荐算法:基于内容的推荐_1:内容推荐算法

    基于内容的推荐 推荐给用户他们过去喜欢的类似产品 基于CF的推荐 识别出具有相同爱好的用户 给他们推产品 基于内容的推荐算法 基于内容推荐的步骤 对数据内容分析 得到物品的结构化描述 分析用户过去的评分或评论过的物品的 作为用户的训练样本

随机推荐

  • nabc模型_WHϵÁÐÔ²»¡Ô²ÖùÎϸ˼õËÙ»ú3DÁ¢ÌåÄ£ÐÍ_¼õËÙ»ú_¼õËÙÆ÷_Öйú¼õËÙ»úÐÅÏ¢Íøwww.jiansuji001.com...

    OzsgSFNGIFYxMy4wNSAKSQAAAABCAFTjJb68dJO9QmDluwAAAD4nMQg TDeJPlp42ux9B0BU17bonjnnTC 0XobeYWYYYCiD2BGNhSYiKogoKqKCBStjixqj
  • vscode打开代码,注释中的中文显示乱码

    问题如下 np random seed 2017 瀹氫箟闅忔満鏁扮殑绉嶅瓙 INPUT CHANNELS 3 杈撳叆鏁版嵁鐨勬尝娈垫暟锛孯GB锛屼负3 OUTPUT MASK CHANNELS 1 瀹氫箟杈撳嚭mask鐨勬尝娈垫暟锛屽彧鏈変
  • String与StringBuffer的区别

    String 是一个常量 即一旦创建不可更改 输出结果为 helloworldjeok 看似 string变量name的值改变了 其实此name非彼name 输出结果为 sex hello worldjeok name hello worl
  • ocaml学习随笔-1

    utop let rec my listprint items match items with first the rest gt printf s n first my listprint the rest gt val my list
  • React入门笔记(二)

    React入门笔记 二 1 前情回顾 2 组件 3 视频教程地址 1 前情回顾 书接上回 React入门笔记 一 主要介绍React的基本特点 虚拟dom的实现原理 利用包管理工具搭建基本的React单页面引用等 如果你跳过了前面的项目配置
  • Regular Expression实现

    主要分2大块 核心部分 就是一个NFA 只支持标准正则的操作 concatenation union iteration 限定上限的iteration 对应的meta character只有 upper 扩展部分 这部分是把扩展正则表达式转
  • 三顾茅庐,七面阿里,成功上岸25k16薪,我行你也行~

    写在片头 声明 勿杠 首先简单说一下 这三次面试阿里并不是一次性去面的 实际上第一次面试时候还在大四 找的实习岗 不太清楚是什么部门 别问我为什么还记得面试题 有记录和复盘的习惯 再问就是杠 个人背景不详细多说 学历双非本科 不是应届生 工
  • OpenCV之YOLOv2-tiny目标检测

    个人主页 风间琉璃 版权 本文由 风间琉璃 原创 在CSDN首发 需要转载请联系博主 如果文章对你有帮助 欢迎关注 点赞 收藏 一键三连 和订阅专栏哦 目录 前言 一 YOLOv2 tiny介绍 二 预处理 三 模型加载与推理 四 解析输出
  • mvc:resources,mvc:default-servlet-handler/和RequestMapping注解有冲突, 导致动态资源不能访问的解决方案

    mvc resources mvc default servlet handler 和RequestMapping注解有冲突 导致动态资源不能访问 解决的方式是在配置文件加入 mvc annotation driven 注解驱动
  • RabbitMq(二)工作队列

    RabbitMq 二 工作队列 分布机制 使用工作队列实现任务分发的功能 一个队列的优点就是很容易处理并行化的工作能力 但是如果我们积累了大量的工作 我们就需要更多的工作者来处理 这里就要采用分布机制了 例 分布机制 定义交换机 多个消费者
  • Linux的发展历史及版本简介

    Linux发展历史及常用版本介绍 由于最近一段时间的学习要基于Linux操作系统 之前在各个版本的Linux之间看的眼花缭乱 那么经过自己查阅和总结之后 对Linux的发展历史和现在目前比较流行的Linux版本的特点有了一些大致的了解 在这
  • case when的几种用法

    用法一 case 字段 when select case c sex when 1 then 男 else 女 end as 性别 count as 人数 from user inofr group by 性别 用法二 case when
  • AndroidStudio 卡在下载gradle,官网下载gradle压缩包太慢了解决办法

    解决办法 一 打开下面网站 https services gradle org distributions 二 右键检查或者F12 找到你需要的版本的下载地址复制 如下图 最终地址格式 https services gradle org d
  • MySQL中length函数(刷SQL题时学到的)

    查找字符串中逗号出现的次数 牛客题霸 牛客网 3 查询某个字符出现几次 length str1 length replace str1 str2
  • EditText输入内容拦截和监听删除

    系列文章目录 文章目录 系列文章目录 前言 拦截输入内容提交 监听软件盘删除按钮点击事件 监听输入框文字粘贴 复制 全选等 code 前言 有时候我们会有一些特殊的需求 需要对输入框进行特殊的处理 比如 对输入内容去除特殊字符操作 或拦截输
  • statsmodels.tsa.stattools.adfuller 的用法

    statsmodels tsa stattools adfuller x maxlag None regression c autolag AIC store False regresults False source 增广Dickey F
  • Linux下vi命令编辑器,编辑 ,保存和退出

    1 vi 文件名 vi后面有空格 接着按回车即可打开对应的文件 如果没有对应的文件 那么vi命令就会自动创建一个新的 2 vi打开文件后是命令模式状态 要用i或者a命令或Insert键才可进入可编辑的状态 最下面会出现 INSERT 3 保
  • python 列表操作方法详解及例子

    原文链接 https www cnblogs com wj 1314 p 8433116 html 列表是Python中最基本的数据结构 列表是最常用的Python数据类型 列表是一个数据的集合 集合内可以放任何数据类型 可对集合方便的增删
  • 云服务器安装操作系统后如何连接,服务器如何安装操作系统

    服务器如何安装操作系统 内容精选 换一换 如果您需要使用毕昇编译器 则需要先在服务端安装毕昇编译器 毕昇编译器基于开源LLVM开发 并进行了优化和改进 同时将flang作为默认的Fortran语言前端编译器 是针对鲲鹏平台的高性能编译器 当
  • 华为OD机考-模拟消息队列(C,python)

    题目描述 让我们来模拟一个消息队列的运作 有一个发布者和若干消费者 发布者会在给定的时刻向消息队列发送消息 若此时消息队列有消费者订阅 这个消息会被发送到订阅的消费者中优先级最高 输入中消费者按优先级升序排列 的一个 若此时没有订阅的消费者