LeetCode 1348:推文时间序列统计的设计与优化
1. 问题背景与需求分析Tweet Counts Per Frequency 是 LeetCode 平台上的一道中等难度设计题属于系统设计类别。这道题模拟了社交媒体平台中常见的推文统计功能要求实现一个能够按不同时间粒度统计推文数量的类。在实际应用中类似功能广泛存在于各类社交平台微博的热搜统计Twitter 的话题趋势分析论坛的活跃度监控题目核心是设计一个 TweetCounts 类需要支持两种操作recordTweet(string tweetName, int time) - 记录推文getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime) - 获取统计结果2. 数据结构选型与设计思路2.1 存储结构的选择对于这类时间序列数据的统计问题常见的数据结构选择有有序数组优点查询时可以二分查找插入需要维护有序性缺点插入时间复杂度 O(n)平衡二叉搜索树优点插入和查询都是 O(logn)缺点实现复杂哈希表列表优点插入快查询时需要排序缺点查询性能不稳定经过比较我们选择使用哈希表有序列表的组合from bisect import bisect_left, insort class TweetCounts: def __init__(self): self.tweets defaultdict(list)2.2 时间粒度处理题目中定义了三种统计频率minute每分钟hour每小时day每天需要将时间戳转换为对应的时间区间。这里的关键是正确计算时间段的划分方式。3. 核心算法实现3.1 记录推文实现def recordTweet(self, tweetName: str, time: int) - None: insort(self.tweets[tweetName], time)使用 bisect 模块的 insort 方法可以在插入时自动维护列表的有序性保证后续查询效率。3.2 统计查询实现def getTweetCountsPerFrequency(self, freq: str, tweetName: str, startTime: int, endTime: int) - List[int]: if tweetName not in self.tweets: return [] delta 60 if freq minute else 3600 if freq hour else 86400 times self.tweets[tweetName] res [] i startTime while i endTime: j min(i delta, endTime 1) left bisect_left(times, i) right bisect_left(times, j) res.append(right - left) i j return res算法步骤解析确定时间间隔 delta初始化结果列表和起始时间指针 i循环处理每个时间段计算当前时间段的结束时间 j使用二分查找确定时间段内的推文数量移动指针到下一个时间段4. 复杂度分析与优化4.1 时间复杂度recordTweet: O(n) 由于需要移动元素getTweetCountsPerFrequency: O(mlogn) m是时间段数量4.2 优化思路对于高频插入场景可以考虑改用平衡二叉搜索树结构如 Python 中的 SortedContainer 模块from sortedcontainers import SortedList class TweetCounts: def __init__(self): self.tweets defaultdict(SortedList) def recordTweet(self, tweetName: str, time: int) - None: self.tweets[tweetName].add(time) def getTweetCountsPerFrequency(self, freq: str, tweetName: str, startTime: int, endTime: int) - List[int]: if tweetName not in self.tweets: return [] delta 60 if freq minute else 3600 if freq hour else 86400 times self.tweets[tweetName] res [] i startTime while i endTime: j min(i delta, endTime 1) left times.bisect_left(i) right times.bisect_left(j) res.append(right - left) i j return res这样可以将 recordTweet 的时间复杂度优化到 O(logn)。5. 边界条件与测试用例5.1 常见边界情况重复时间戳的记录startTime 等于 endTime查询不存在的 tweetName大时间跨度的统计5.2 测试用例示例def test_tweet_counts(): tc TweetCounts() tc.recordTweet(tweet1, 0) tc.recordTweet(tweet1, 60) tc.recordTweet(tweet1, 10) assert tc.getTweetCountsPerFrequency(minute, tweet1, 0, 59) [2] assert tc.getTweetCountsPerFrequency(minute, tweet1, 0, 60) [2, 1] assert tc.getTweetCountsPerFrequency(hour, tweet1, 0, 3600) [3] assert tc.getTweetCountsPerFrequency(day, notexist, 0, 100) []6. 实际应用扩展6.1 分布式场景下的实现对于大型社交平台推文数据量巨大需要考虑分布式方案按 tweetName 分片存储使用 MapReduce 进行统计计算预聚合常用时间粒度的统计数据6.2 实时统计优化可以使用以下技术优化实时查询性能时间序列数据库如 InfluxDB流处理框架如 Flink近似统计算法如 HyperLogLog7. 同类问题对比类似的时间序列统计问题在 LeetCode 上还有Data Stream as Disjoint IntervalsRange ModuleMy Calendar III这些题目都涉及对时间区间的操作和统计可以对比学习。

相关新闻

多线程加速?数据全乱了

多线程加速?数据全乱了

📋 本期菜单:GIL 限制 count 丢更新 threading vs multiprocessing 死锁 asyncio 阻塞 忘记 await 线程池泄漏 Queue 异常 pickle 限制 回调线程 毛毛姐的粉丝涨到 10w 了。她觉得单线程爬数据太慢,决定上多线程加速。 半小时后,她发来一条语音:「家人们谁懂啊…

2026/10/22 12:14:11 阅读更多 →
SpringBoot农业数据管理平台开发实践

SpringBoot农业数据管理平台开发实践

1. 项目背景与核心需求 农科所作为农业科研的前沿阵地,每天产生大量作物生长数据、实验记录和品种信息。传统Excel表格管理方式存在数据分散、版本混乱、协作困难等痛点。我去年参与某省级农科院信息化改造时,发现研究人员平均每周要花费8小时在数据整理…

2026/10/25 4:23:04 阅读更多 →
从戏剧化设定到可信叙事:如何构建“篡改志愿”故事的人物与情节

从戏剧化设定到可信叙事:如何构建“篡改志愿”故事的人物与情节

1. 先搞清楚这个标题到底在讲什么:一个关于“志愿篡改”的叙事内核 看到这个标题,第一反应可能觉得这是个猎奇故事,或者是个技术教程。但仔细拆解,它的核心其实是一个 高度戏剧化的叙事设定 ,而非一个真实的技术操作…

2026/10/25 4:06:44 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →