1. 题目描述
https://leetcode.cn/problems/number-of-recent-calls/
写一个 RecentCounter 类来计算特定时间范围内最近的请求。
请你实现 RecentCounter 类:
- RecentCounter() 初始化计数器,请求数为 0 。
- int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
保证 每次对 ping 的调用都使用比之前更大的 t 值。
示例 1:
输入: [“RecentCounter”, “ping”, “ping”, “ping”, “ping”] [[], [1], [100], [3001], [3002]] 输出: [null, 1, 2, 3, 3] 解释: RecentCounter recentCounter = new RecentCounter(); recentCounter.ping(1); // requests = [1],范围是 [-2999,1],返回 1 recentCounter.ping(100); // requests = [1, 100],范围是 [-2900,100],返回 2 recentCounter.ping(3001); // requests = [1, 100, 3001],范围是 [1,3001],返回 3 recentCounter.ping(3002); // requests = [1, 100, 3001, 3002],范围是 [2,3002],返回 3
提示:
- 1 <= t <= 109
- 保证每次对 ping 调用所使用的 t 值都 严格递增
- 至多调用 ping 方法 104 次
2. 题解
2022-05-06 AC, 就是统计数量 ```php <?php /**- Created by PhpStorm
- User: jtahstu
- Time: 2022/5/5 19:24
- Des: 933. 最近的请求次数
- https://leetcode.cn/problems/number-of-recent-calls/
- 写一个 RecentCounter 类来计算特定时间范围内最近的请求。 */
class RecentCounter {
private $ping_times = [];
function __construct()
{
$this->ping_times = [];
}
/**
* @param Integer $t
* @return Integer
*/
function ping($t)
{
$this->ping_times[] = $t;
// $count = 0; // for ($i = count($this->ping_times) - 1; $i >= 0; $i—) { //朴素解法, 从后往前统计数量 // if ($t - $this->ping_times[$i] <= 3000) { // $count++; // } else { // break; // } // } // return $count;
while ($this->ping_times[0] < $t - 3000) { //只要不是3000内的直接弹出即可
array_shift($this->ping_times);
}
return count($this->ping_times);
}
}
/**
- Your RecentCounter object will be instantiated and called as such:
- $obj = RecentCounter();
- $ret_1 = $obj->ping($t); */
$obj = new RecentCounter(); var_dump($obj->ping(1)); var_dump($obj->ping(100)); var_dump($obj->ping(3001)); var_dump($obj->ping(3002)); var_dump($obj->ping(3005));
/**
- 执行用时:188 ms, 在所有 PHP 提交中击败了75.00%的用户
- 内存消耗:30.3 MB, 在所有 PHP 提交中击败了25.00%的用户
- 通过测试用例:68 / 68 *
- 朴素的解法就慢很多
- 执行用时:908 ms, 在所有 PHP 提交中击败了25.00%的用户
- 内存消耗:30 MB, 在所有 PHP 提交中击败了100.00%的用户
- 通过测试用例:68 / 68 */ ```