RecentCounter

简介: 【10月更文挑战第12天】

[[], [1], [100], [3001], [3002]] 转换为 RecentCounter 类的 ping 方法的调用,并得到输出结果 [None, 1, 2, 3, 3],你需要编写一段代码来模拟这个过程。下面是一个 Python 代码示例,它创建了 RecentCounter 类的实例,并按照给定的输入序列调用 ping 方法,然后收集每次调用的返回值。

from collections import deque

class RecentCounter:
    def __init__(self):
        self.requests = deque()

    def ping(self, t: int) -> int:
        self.requests.append(t)
        # 移除不在 [t-3000, t] 范围内的请求
        while self.requests and self.requests[0] < t - 3000:
            self.requests.popleft()
        return len(self.requests)

# 模拟输入
operations = [[], [1], [100], [3001], [3002]]
# 初始化 RecentCounter 实例
recent_counter = RecentCounter()

# 存储输出结果
results = []

# 遍历操作序列
for operation in operations:
    if operation:  # 如果操作列表不为空,调用 ping 方法
        results.append(recent_counter.ping(operation[0]))
    else:  # 否则,添加 None 表示实例化操作没有返回值
        results.append(None)

# 打印输出结果
print(results)  # 输出应为 [None, 1, 2, 3, 3]

解题思路:

方法选择
选用的方法是使用一个队列来维护时间戳,队列中存储的是请求对应的时间点。当新请求到来时,我们将该时间点加入队列;同时移除那些不在最近3000毫秒内的请求时间点。这样,队列中的所有时间点就代表了最近3000毫秒内的所有请求,队列的长度即为我们要求的结果。

解题过程

  1. 初始化一个队列来存储请求的时间戳。
  2. 每次调用 ping 方法时,首先将当前时间戳加入队列。
  3. 然后检查队列的头部,如果队列头部的时间戳与当前时间戳的差值大于3000毫秒,则将其移除队列。
  4. 重复步骤3,直到队列头部的时间戳与当前时间戳的差值不超过3000毫秒或队列为空。
  5. 返回此时队列的长度,即为最近3000毫秒内的请求数量。

具体运用

  • 使用 deque(双端队列)作为存储结构,因为它允许我们在两端快速地添加和移除元素。
  • ping 方法中,使用 append 操作将新的时间戳添加到队列的末尾。
  • 使用 popleft 操作移除队列头部的时间戳,直到满足时间要求或队列变空。
  • 返回队列的长度,这个长度就是最近3000毫秒内的请求数。

复杂度分析

  • 时间复杂度:O(N),其中N是调用 ping 方法的次数。在最坏的情况下,每次 ping 调用都可能需要移除队列中的所有元素。但在平均情况下,由于请求是均匀到达的,所以每次 ping 调用平均只需要移除一个元素,时间复杂度接近O(1)。

  • 空间复杂度:O(N),最坏情况下,队列中可能需要存储所有请求的时间戳,其中N是调用 ping 方法的次数。在实际应用中,队列的大小通常不会超过3000毫秒内请求的数量,因此空间复杂度通常也是O(1)。

综上,我们得到的是一个时间效率和空间效率都相对较高的解决方案。下面是具体的代码实现:

from collections import deque

class RecentCounter:
    def __init__(self):
        self.queue = deque()  # 使用队列存储时间戳

    def ping(self, t: int) -> int:
        self.queue.append(t)  # 添加新的时间戳
        # 移除不在 [t-3000, t] 范围内的时间戳
        while self.queue and self.queue[0] < t - 3000:
            self.queue.popleft()
        # 返回队列的长度,即最近3000毫秒内的请求数量
        return len(self.queue)

# Your RecentCounter object will be instantiated and called as such:
# obj = RecentCounter()
# param_1 = obj.ping(t)
目录
相关文章
|
2月前
|
运维 自然语言处理 Cloud Native
云栖实录 | 智能运维年度重磅发布及大模型实践解读
阿里云大数据运维团队重磅发布云原生大规模集群场景的 GitOps 方案,该方案基于 OAM 云原生模型,促进研发与运维人员协作,同时兼顾变更的过程管理和终态管理,可实现变更的自动化、代码化、透明化。此外,阿里云大数据运维团队分享了大模型在大数据智能运维场景的应用实践,通过引入检索增强生成(RAG)方法和其他优化策略,大幅提高了在智能问答和智能诊断方面知识的关联性和检索精度,并基于多智能体框架建立高效的数据分析和决策支持系统。
|
2月前
|
消息中间件 监控 Ubuntu
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
96 3
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
|
2月前
|
传感器 监控 JavaScript
千套单片机\stm32毕设课设题目及资料案列-干货分享
为帮助电子工程领域的学习者顺利毕业或掌握更多专业知识,我们精心整理了一系列单片机和STM32相关的题目及资料案例。这些资源覆盖了从毕业设计到课程设计的各个方面,包括但不限于智能小车、温度控制系统、无线通信、智能家居等多个领域。每项设计都配有详细的原理图、仿真图以及完整的文档资料,旨在帮助学生深入理解理论知识的同时,提高实际动手操作能力。无论是初学者还是有一定基础的学生,都能从中找到适合自己的项目进行实践探索。
296 8
|
2月前
|
运维 安全 Linux
IDC服务器故障排除思路
本文详细介绍了服务器维修流程,包括维修前的工具和备件准备,以及不拆机情况下的初步检查步骤。文中还提供了拆机维修的具体方法,如最小化测试法、替换法和交叉比较法,并针对CPU、主板、内存、硬盘、电源、风扇、网卡及BMC等主要配件的故障排除进行了说明,强调了注意事项,旨在帮助技术人员快速准确地定位并解决问题。
118 13
|
2月前
|
tengine 应用服务中间件 nginx
Tengine命令安装教程
该内容提供了一套详细的步骤指南,用于通过 FinalShell 远程连接并安装 Tengine 服务器。从下载与配置 Tengine,到使用 yum 安装必要的组件,再到编译、安装及配置 Nginx,以及如何处理 HTTPS 部署和证书设置,最后涵盖了基本的站点程序控制命令。此外,还提供了隐藏版本号的方法及文本编辑技巧。
|
2月前
|
Kubernetes API 调度
中间层 k8s(Kubernetes) 到底是什么,架构是怎么样的?
中间层 k8s(Kubernetes) 到底是什么,架构是怎么样的?
63 3
|
2月前
|
SQL 关系型数据库 MySQL
详解 pypika 模块:SQL 语句生成器,让你再也不用为拼接 SQL 语句而发愁
详解 pypika 模块:SQL 语句生成器,让你再也不用为拼接 SQL 语句而发愁
185 4
|
2月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
98 3
|
2月前
|
存储 Python
哈希表
【10月更文挑战第11天】
37 4
|
2月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益严重。本文将从网络安全漏洞、加密技术和安全意识三个方面,探讨如何保护个人信息和网络安全。我们将通过实例分析,了解网络攻击者如何利用安全漏洞进行攻击,以及如何运用加密技术防止数据泄露。同时,我们还将讨论提高个人和企业的安全意识的重要性。