news 2026/4/16 15:07:47

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 23:41:27

把 GPT-4o 装进口袋却不联网?这家公司造出了 300 克的“AI 核弹”,硅谷云巨头今夜无眠

这是一场对物理定律和商业模式的双重宣战。 请看一眼本文开头的这张图片。 左边那个黑色的小盒子,看起来像什么?一个稍微厚一点的充电宝?一个不起眼的移动硬盘?右边是一台 iPhone 15 Pro,作为早已被我们习以为常的“现代科技巅峰”的参照物。 此时此刻,你的手机也许正…

作者头像 李华
网站建设 2026/4/12 1:33:51

SpringBoot 集成远程 Redis 连接失败:自动配置与依赖排查实战

本文的核心读者是 SpringBoot 初学者、后端开发工程师&#xff0c;以及在项目中遇到 “配置远程 Redis 后仍连接 localhost” 问题的技术人员。将为你解决以下实际问题&#xff1a; 明明配置了 spring.redis.host 远程地址&#xff0c;项目却始终使用默认 localhost:6379 连接…

作者头像 李华
网站建设 2026/4/16 13:33:26

15、嵌入式系统中的设备驱动、多线程调试与网络编程

嵌入式系统中的设备驱动、多线程调试与网络编程 1. 设备驱动介绍 在特定应用中,Linux 内核提供了三个设备驱动来访问相关的外围设备,具体如下: | 设备驱动 | 功能描述 | | ---- | ---- | | /dev/adc | read() 函数返回通道 0 的数字文本字符串 | | /dev/leds | …

作者头像 李华
网站建设 2026/4/15 14:52:53

如何快速修复MPV在Mac上的色彩失真:4步完整指南

如何快速修复MPV在Mac上的色彩失真&#xff1a;4步完整指南 【免费下载链接】mpv &#x1f3a5; Command line video player 项目地址: https://gitcode.com/GitHub_Trending/mp/mpv 当你在Mac上使用MPV播放高清视频时&#xff0c;是否遇到过画面偏绿、细节模糊或HDR效果…

作者头像 李华
网站建设 2026/4/16 10:40:16

22、嵌入式系统开发:BusyBox、显示设置与U-Boot配置

嵌入式系统开发:BusyBox、显示设置与U-Boot配置 1. BusyBox的使用 BusyBox 可执行文件通常安装在 /bin 目录,这里也是大多数用户级命令行实用程序所在之处。为了让 BusyBox 能模拟不同命令,我们可以创建符号链接。例如,在 /bin 目录下创建如下符号链接: ln -s bus…

作者头像 李华
网站建设 2026/4/16 12:26:30

23、嵌入式Linux系统开发:NOR闪存修复、文件系统创建与硬件定义方法

嵌入式Linux系统开发:NOR闪存修复、文件系统创建与硬件定义方法 1. NOR闪存重编程 当NOR闪存出现问题时,可以通过开发板的JTAG端口对其进行重编程。Mini2440套件中有一个名为JTAG “wiggler”的设备,它可以插入PC的并行端口,并连接到开发板上的10针扁平电缆JTAG端口。需要…

作者头像 李华