难度: 简单 标签: 队列

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 /**

class RecentCounter {

  1. private $ping_times = [];
  2. function __construct()
  3. {
  4. $this->ping_times = [];
  5. }
  6. /**
  7. * @param Integer $t
  8. * @return Integer
  9. */
  10. function ping($t)
  11. {
  12. $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 */ ```