当前位置: 首页 > news >正文

LeetCode 3433.统计用户被提及情况:(大)模拟

【LetMeFly】3433.统计用户被提及情况:(大)模拟

力扣题目链接:https://leetcode.cn/problems/count-mentions-per-user/

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

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

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

返回数组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]) <= 105
  • 在任意"MESSAGE"事件中,以id<number>形式提及的用户数目介于1100之间。
  • 0 <= <number> <= numberOfUsers - 1
  • 题目保证OFFLINE引用的用户 id 在事件发生时处于在线状态。

解题方法:模拟

最多100个人,最多100个事件,所以直接暴力模拟就好了。

创建一个答案数组,初始值全部为0,接着开始遍历事件:

  • 如果事件是OFFLINE,则什么都不做,直接continue。否则一定是消息事件:
  • 如果事件是ALL,则每人+1
  • 如果事件是HERE,则先每人+1,然后再遍历一遍事件数组,如果存在60时间内的下线时间,则此人-1
  • 否则(@指定人),被提及到的人们+1

以上。

时空复杂度分析

e = l e n ( e v e n t s ) e=len(events)e=len(events)n = n u m b e r O f U s e r s n=numberOfUsersn=numberOfUsers

  • 单次操作时间复杂度:下线O ( 1 ) O(1)O(1)、所有人O ( n ) O(n)O(n)、在线人O ( n + e ) O(n+e)O(n+e)、指定人O ( l e n ( e v e n t s [ i ] [ 2 ] ) ) O(len(events[i][2]))O(len(events[i][2]))
  • 总空间复杂度O ( n ) O(n)O(n)

AC代码

Python
''' LastEditTime: 2025-12-12 13:42:16 '''fromtypingimportListclassSolution:defcountMentions(self,numberOfUsers:int,events:List[List[str]])->List[int]:ans:List[int]=[0]*numberOfUsersforaction,time,whoinevents:ifaction=="OFFLINE":continueifwho=="ALL":ans=[x+1forxinans]elifwho=="HERE":ans=[x+1forxinans]fora,t,winevents:ifa=="OFFLINE"andint(time)-60<int(t)<=int(time):ans[int(w)]-=1else:foriin(int(w[2:])forwinwho.split(" ")):ans[i]+=1returnans# 差点忘了return

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

http://www.cnnetsun.cn/news/23998.html

相关文章:

  • 百度网盘秒传技术全解析:从零基础到效率达人的终极指南
  • OpenAI Whisper Large-V3-Turbo本地部署终极指南:从零搭建到性能调优
  • 75、深入探索GDB调试器:命令详解与实用技巧
  • 7 款热门文件加密软件深度测评!2025 加密工具最佳选择
  • Linux环境下的C语言编程(四十)
  • 矮冬瓜矮砧密植:水肥一体化系统铺设全攻略
  • P11960 [GESP202503 五级] 平均分配
  • PINNs-Torch:实现9倍加速的物理信息神经网络框架
  • GPT-5.2发布!这些超强新功能,快来看看它是怎么让你的工作更轻松的!
  • ChromePass:三分钟掌握Chrome密码提取的终极指南
  • 【方法】IP66.net:如何查到自己的IP?
  • 南京大学开源SteadyDancer模型实现完美动作迁移,首帧保留彻底解决身份漂移难题
  • 机器视觉相机参数
  • springboot基于vue的观赏鱼养殖互助商城系统的设计与实现_1vlf0334
  • 压差式静力水准仪液体选择必看!从充液到排气:沉降监测系统安装全流程避雷手册
  • 构建可靠数据库连接:人大金仓JDBC驱动8.6.0实战指南
  • 嵌入式零基础到就业年班
  • 如何快速提取Chrome密码:跨平台开源工具完整指南
  • 5分钟掌握RichTextKit:SwiftUI富文本编辑器终极指南
  • 如何有效准备编程竞赛?五个阶段科学备考方法
  • BG3模组管理器终极指南:5分钟快速上手博德之门3模组管理
  • 6、黑客必备:Linux 网络技能与软件管理
  • Font Awesome 7全面解析:现代化图标解决方案的革新之路
  • MySQL业务数据量增长到单表成为瓶颈时,该如何做?
  • 13、Linux 系统日志处理与服务使用技巧
  • Paperzz 论文查重:从 “重复率焦虑” 到 “合规清晰”,学术新人如何用工具搞定论文的 “终稿安检”
  • Bananas屏幕共享:3分钟学会零门槛跨平台协作
  • 使用二进制文件方式部署kubernetes(1)
  • 如何在Mac上安装KeyCastr:5步搞定按键可视化工具
  • 小学生学C++编程 (位运算精讲)