news 2026/5/1 7:07:37

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/28 2:40:00

readme_revenge 34C3 2017 CTF pwn学习House of Husk

参考学习&#xff1a; https://www.anquanke.com/post/id/202387#h2-0 前置知识 这种攻击方式主要是利用了printf的一个调用链&#xff0c;应用场景是只能分配较大chunk时(超过fastbin)&#xff0c;存在或可以构造出UAF漏洞。 在使用printf类格式化字符串函数进行输出的时候&am…

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

21、Linux内核模块、设备驱动与BusyBox使用指南

Linux内核模块、设备驱动与BusyBox使用指南 1. 设备中断线探测 内核提供了一对函数来帮助确定设备连接到哪个中断线,这在 kernel_probe() 函数(从第276行开始)中有说明: - probe_irq_on() :返回当前未分配中断的位掩码。该函数保存返回值,然后安排设备生成一个中断…

作者头像 李华
网站建设 2026/4/24 12:12:24

24、嵌入式 Linux 开发:工具与环境全解析

嵌入式 Linux 开发:工具与环境全解析 1. 命令行与 GUI 的偏好 在编程领域,对于命令行编程和图形用户界面(GUI)编程,不同的人有不同的偏好。有人对 DOS 系统十分熟悉,甚至在更早的时候就钻研过 RT - 11、RSX - 11 和 VMS 系统,这表明他们对命令行编程并不陌生。在 Wind…

作者头像 李华
网站建设 2026/4/28 17:52:43

为什么浏览器能看懂网页代码?——从HTML到渲染引擎的奇幻之旅

&#x1f310; 为什么浏览器能看懂网页代码&#xff1f;——从HTML到渲染引擎的奇幻之旅 &#x1f4bb;欢迎大家来到今日份的无限大博客&#xff0c;今天又又又又是一期计算机十万个为什么系列的文章 让我来带领你开启今日份的学习吧当你在浏览器地址栏输入 https://www.baidu.…

作者头像 李华
网站建设 2026/4/29 21:20:10

德卡读卡器SDK:快速集成读卡器版本查询功能

德卡读卡器SDK&#xff1a;快速集成读卡器版本查询功能 【免费下载链接】德卡读卡器SDK下载 本仓库提供德卡读卡器T10、D8、D3和T60系列的最新SDK&#xff08;版本1.5&#xff09;下载。该SDK包含最新的DEMO程序&#xff0c;用户可以通过该程序查询读卡器的版本号&#xff0c;便…

作者头像 李华