news 2026/6/15 13:29:15

leetcode 3433. 统计用户被提及情况 中等

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
leetcode 3433. 统计用户被提及情况 中等

给你一个整数numberOfUsers表示用户总数,另有一个大小为n x 3的数组events

每个events[i]都属于下述两种类型之一:

  1. 消息事件(Message Event):["MESSAGE", "timestampi", "mentions_stringi"]
    • 事件表示在timestampi时,一组用户被消息提及。
    • mentions_stringi字符串包含下述标识符之一:
      • id<number>:其中<number>是一个区间[0,numberOfUsers - 1]内的整数。可以用单个空格分隔多个id ,并且 id 可能重复。此外,这种形式可以提及离线用户。
      • ALL:提及所有用户。
      • HERE:提及所有在线用户。
  2. 离线事件(Offline Event):["OFFLINE", "timestampi", "idi"]
    • 事件表示用户iditimestampi时变为离线状态60 个单位时间。用户会在timestampi + 60时自动再次上线。

返回数组mentions,其中mentions[i]表示 id 为i的用户在所有MESSAGE事件中被提及的次数。

最初所有用户都处于在线状态,并且如果某个用户离线或者重新上线,其对应的状态变更将会在所有相同时间发生的消息事件之前进行处理和同步。

注意在单条消息中,同一个用户可能会被提及多次。每次提及都需要被分别统计。

示例 1:

输入:numberOfUsers = 2, events = [["MESSAGE","10","id1 id0"],["OFFLINE","11","0"],["MESSAGE","71","HERE"]]

输出:[2,2]

解释:

最初,所有用户都在线。

时间戳 10 ,id1id0被提及,mentions = [1,1]

时间戳 11 ,id0离线

时间戳 71 ,id0再次上线并且"HERE"被提及,mentions = [2,2]

示例 2:

输入:numberOfUsers = 2, events = [["MESSAGE","10","id1 id0"],["OFFLINE","11","0"],["MESSAGE","12","ALL"]]

输出:[2,2]

解释:

最初,所有用户都在线。

时间戳 10 ,id1id0被提及,mentions = [1,1]

时间戳 11 ,id0离线

时间戳 12 ,"ALL"被提及。这种方式将会包括所有离线用户,所以id0id1都被提及,mentions = [2,2]

示例 3:

输入:numberOfUsers = 2, events = [["OFFLINE","10","0"],["MESSAGE","12","HERE"]]

输出:[0,1]

解释:

最初,所有用户都在线。

时间戳 10 ,id0离线

时间戳 12 ,"HERE"被提及。由于id0仍处于离线状态,其将不会被提及,mentions = [0,1]

提示:

  • 1 <= numberOfUsers <= 100
  • 1 <= events.length <= 100
  • events[i].length == 3
  • events[i][0]的值为MESSAGEOFFLINE
  • 1 <= int(events[i][1]) <= 10^5
  • 在任意"MESSAGE"事件中,以id<number>形式提及的用户数目介于1100之间。
  • 0 <= <number> <= numberOfUsers - 1
  • 题目保证OFFLINE引用的用户 id 在事件发生时处于在线状态。

分析:先将所有的事件按照发生时间从小到大排序,时间相同的事件,离线排在消息前面处理。同时用一个数组 flag 标识用户是否在线。初始时 flag 全为 -1,代表所有用户都在线;接着当遇到离线事件时,将离线用户 i 的 flag[i] 改为对应 times+60,表示用户 i 在 times+60 这个时间及之后在线。排序后遍历所有的消息,按照题目要求进行记录即可。

/** * Note: The returned array must be malloced, assume caller calls free(). */ typedef struct node { int ind,times; char type; }node; int cmp(const void *a,const void *b) { node *aa=a; node *bb=b; if(aa->times!=bb->times) return aa->times-bb->times; if(aa->type!=bb->type) return bb->type-aa->type; return aa->ind-bb->ind; } int* countMentions(int numberOfUsers, char*** events, int eventsSize, int* eventsColSize, int* returnSize) { int *ans=(int*)malloc(sizeof(int)*(numberOfUsers+5));*returnSize=numberOfUsers; int flag[numberOfUsers+5]; node temp[eventsSize+5]; for(int i=0;i<numberOfUsers;++i) ans[i]=0,flag[i]=-1; for(int i=0;i<eventsSize;++i) { temp[i].ind=i,temp[i].type=events[i][0][0]; temp[i].times=0; for(int j=0;events[i][1][j];++j) temp[i].times=temp[i].times*10+events[i][1][j]-'0'; } qsort(temp,eventsSize,sizeof(node),cmp); for(int i=0;i<eventsSize;++i) { int pos=temp[i].ind,times=temp[i].times; if(events[pos][0][0]=='M') { if(events[pos][2][0]=='A') { for(int j=0;j<numberOfUsers;++j) ans[j]++; } else if(events[pos][2][0]=='H') { for(int j=0;j<numberOfUsers;++j) { if(flag[j]==-1||flag[j]<=times) ans[j]++; } } else { int id=0; for(int j=2;events[pos][2][j];++j) { if(events[pos][2][j]==' ') ans[id]++,id=0; else if(events[pos][2][j]>='0'&&events[pos][2][j]<='9') id=id*10+events[pos][2][j]-'0'; else continue; } ans[id]++,id=0; } } else { int id=0; for(int j=0;events[pos][2][j];++j) { if(events[pos][2][j]==' ') flag[id]=times+60,id=0; else if(events[pos][2][j]>='0'&&events[pos][2][j]<='9') id=id*10+events[pos][2][j]-'0'; else continue; } flag[id]=times+60,id=0; } } return ans; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 11:30:41

RUIE水下图像数据集备用下载指南

RUIE水下图像数据集备用下载指南 【免费下载链接】RUIE水下图像数据集备用下载 - **数据集名称**: RUIE水下图像数据集- **数据集描述**: 该数据集包含了大量真实世界的水下图像&#xff0c;适用于水下图像增强的研究。数据集的详细信息和使用方法可以参考相关博文&#xff0c;…

作者头像 李华
网站建设 2026/6/14 21:03:32

终极指南:如何用me_cleaner彻底掌控你的Intel硬件安全

终极指南&#xff1a;如何用me_cleaner彻底掌控你的Intel硬件安全 【免费下载链接】me_cleaner Tool for partial deblobbing of Intel ME/TXE firmware images 项目地址: https://gitcode.com/gh_mirrors/me/me_cleaner Intel ME清理工具me_cleaner是保护系统隐私的必备…

作者头像 李华
网站建设 2026/6/14 16:33:28

阿尔比恩OL数据分析工具:让你的游戏决策更聪明

还在为《阿尔比恩OL》中那些让人头疼的数据问题而烦恼吗&#xff1f;比如不知道哪些装备最适合自己&#xff0c;或者总是错过最佳的交易时机&#xff1f;别担心&#xff0c;今天我要分享的这款阿尔比恩OL数据分析工具&#xff0c;正是为你解决这些问题的得力助手。它能实时监控…

作者头像 李华
网站建设 2026/6/15 2:37:08

代码质量检测新维度:多语言报告如何改变开发体验

代码质量检测新维度&#xff1a;多语言报告如何改变开发体验 【免费下载链接】fuck-u-code GO 项目代码质量检测器&#xff0c;评估代码的”屎山等级“&#xff0c;并输出美观的终端报告。 项目地址: https://gitcode.com/GitHub_Trending/fu/fuck-u-code 在全球化协作的…

作者头像 李华
网站建设 2026/6/15 12:17:45

如何用Llama-Factory复现顶会论文实验结果?操作路径详解

如何用 Llama-Factory 复现顶会论文实验结果&#xff1f;操作路径详解 在自然语言处理领域&#xff0c;每年顶会&#xff08;如 ACL、EMNLP、NeurIPS&#xff09;都会涌现出大量关于大模型微调的新方法。然而&#xff0c;真正能将论文中的实验“跑出来”的研究者却常常面临困境…

作者头像 李华
网站建设 2026/6/15 5:23:57

代码生成模型再训练:Llama-Factory助力内部编程助手落地

Llama-Factory助力内部编程助手落地&#xff1a;从代码库到智能补全的闭环实践 在现代软件研发节奏日益加快的背景下&#xff0c;工程师每天面对的不仅是功能实现&#xff0c;还有风格统一、规范遵循与知识复用等隐性成本。尽管通用大模型如Llama、Qwen已具备出色的代码生成能力…

作者头像 李华