目录
前言
一、题目描述
二、思路分析
第一种方法(ArrayList顺序表)
第二种方法(队列Queue)
对于今天的这道leetcode题,难度很简单。通过数据结构中的队列,可以直观地解出该题。也可以用顺序表来解该题,思路都是差不多的。
设计知识:队列Queue、顺序表ArrayList
题目名称:最近请求次数
难度:简单
对于这道题,刚开始看题意,可能没那么快能理解该题要表达什么。
结合示例可以帮助自己理解该题。
其实说白了,这道题主要就是要写一个方法,通过调用这个方法添加请求,并返回满足[t-3000,t]这个范围内的请求数。
那么接下来,就来看看如何具体分析该题!
通过题意和示例,我们可以知道,每一次调用ping(t)添加一个新的请求,计数器必须加1,然而之后返回计数器中的请求数应为满足最后一次添加请求时间t的[t-3000,t]范围内,不满足则不计入其内。(而且每次对
ping
的调用都使用比之前更大的t
值)
- 我们可以把这种添加请求的过程,理解成是:每一次添加,其实是在往一个数组里面添加元素t,如果数组内的元素存在不满足([新元素t-3000,t]的范围)则去除这些不满足条件的元素。
- 最后返回数组中有效元素的数量即为请求数
说到数组我们可以联想到数据结构当中的顺序表。
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。其底层是数组
我们可以把添加请求和返回符合条件请求数的过程,看成是对数据增删查改的过程。
- 首先添加一个新请求,即为添加一个数据进数组内
- 之后每一次添加,都要对数组内的每一个元素进行比较,如果不满足条件,则将其抛出。
- 最后返回满足条件的有效元素数量(请求数)即可。
代码示例:
(1)首先定义一个list引用的成员变量;
(2)通过RecentCounter构造方法,完成对list引用的ArrayLIst的实例化。(创建一个顺序表)
(3)在ping(t)方法中,正常添加请求。还需注意的是,每一次添加都需判断列表前每一个元素是否满足条件,最后才返回有效的请求数。
(4)通过ArrayList内的add()方法进行添加,get(0)方法获取列表下标为0位置的元素进行判断,remove(0)方法删除下标为0的元素。因为删除了下标为0位置的元素,那么下标为1位置的元素会取代被删除的元素位置(也就是列表整体左移)
(5)题目中对于ping调用使用的t值都是递增的。那么我们只需判断元素是否不小于t-3000即可,不存在前面有元素大于t的。
代码提交:
对于这道题,最简单的方法可能就是用队列了。
因为这道题的思想,跟队列的操作相契合。
队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的一种特殊线性表。
在队尾插入数据,队头进行删除数据。
也就是说通过调用队列的offer()【入队列】和poll()【出队列】方法可以直接解出该题。
代码示例:
代码提交: