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

面试算法42:最近请求次数

题目

请实现如下类型RecentCounter,它是统计过去3000ms内的请求次数的计数器。该类型的构造函数RecentCounter初始化计数器,请求数初始化为0;函数ping(int t)在时间t添加一个新请求(t表示以毫秒为单位的时间),并返回过去3000ms内(时间范围为[t-3000,t])发生的所有请求数。假设每次调用函数ping的参数t都比之前调用的参数值大。

public class RecentCounter {private Queue<Integer> times;private int windowsSize;
}

例如,在初始化一个RecentCounter计数器之后,ping(1)的返回值是1,因为时间范围[-2999,1]只有1个请求;ping(10)的返回值是2,因为时间范围[-2990,10]有2个请求;ping(3001)的返回值是3,因为时间范围[1,3001]有3个请求;ping(3002)的返回值是3,因为时间范围[2,3002]有3个请求,发生在时间1的请求已经不在这个时间范围内。

分析

为了解决这个问题,首先需要考虑的是用什么数据结构来记录每次请求的时间。在ping(1)、ping(10)、ping(3001)发生时,先后将时间1、10、3001记录到一个数据容器中。接下来发生了ping(3002),此时时间1已经超出当前的时间范围,时间1发生的请求不被计数,因此时间1需要从数据容器中删除。需要注意的是,在1、10、3001、3002这几个时间中,时间1是最先存入数据容器中的,它最先被删除,这符合“先入先出”的规律,因此可以考虑用队列实现这个数据容器。

public class RecentCounter {private Queue<Integer> times;private int windowsSize;public static void main(String[] args) {RecentCounter recentCounter = new RecentCounter();System.out.println(recentCounter.ping(1));System.out.println(recentCounter.ping(10));System.out.println(recentCounter.ping(3001));System.out.println(recentCounter.ping(3002));}public RecentCounter() {times = new LinkedList<>();windowsSize = 3000;}public int ping(int t) {times.offer(t);while (times.peek() + windowsSize < t) {times.poll();}return times.size();}
}

相关文章:

  • PostgreSQL基于Patroni方案的高可用启动流程分析
  • docker 部署 若依 Ruoyi springboot+vue分离版 dockerCompose
  • spark3.3.x处理excel数据
  • MySQL的概念和sql语句
  • RabbitMQ原理(四):MQ的可靠性
  • 医学影像乳腺肿瘤分割的同学看过来:PDPNet:用于通用乳腺肿瘤分割的渐进式双先验网络
  • 多线程---wait和notify
  • 【Android知识笔记】插件化专题(二)
  • 一、基础算法精讲:双指针
  • C++大数加法——最简单实现
  • Webpack 基础以及常用插件使用方法
  • 基于GPIO子系统编写LED驱动
  • ChatGPT如何应对用户提出的道德伦理困境?
  • 【开源】基于SpringBoot的车险自助理赔系统的设计和实现
  • 【实战】Kubernetes安装持久化工具NFS-StorageClass
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 10个最佳ES6特性 ES7与ES8的特性
  • Angular 响应式表单之下拉框
  • C++入门教程(10):for 语句
  • es6--symbol
  • express如何解决request entity too large问题
  • react-native 安卓真机环境搭建
  • SwizzleMethod 黑魔法
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 基于HAProxy的高性能缓存服务器nuster
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • (2)(2.10) LTM telemetry
  • (31)对象的克隆
  • (C)一些题4
  • (南京观海微电子)——I3C协议介绍
  • (转载)Linux 多线程条件变量同步
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .form文件_一篇文章学会文件上传
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 后台导出excel ,word
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET企业级应用架构设计系列之结尾篇
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET使用存储过程实现对数据库的增删改查
  • .NET中GET与SET的用法
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [HNOI2008]水平可见直线
  • [iOS]把16进制(#871f78)颜色转换UIColor
  • [Json.net]快速入门
  • [LeetCode] 196. 删除重复的电子邮箱
  • [Linux]文件基础-如何管理文件