【LeetCode每日一题】——933.最近的请求次数

一【题目类别】

  • 队列

二【题目难度】

  • 简单

三【题目编号】

  • 933.最近的请求次数

四【题目描述】

  • 写一个 RecentCounter 类来计算特定时间范围内最近的请求。
  • 请你实现 RecentCounter 类:
  • RecentCounter() 初始化计数器,请求数为 0 。
  • int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
  • 保证 每次对 ping 的调用都使用比之前更大的 t 值。

五【题目示例】

  • 示例:
    输入:
    [“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 < = 1 0 9 1 <= t <= 10^9 1<=t<=109
  • 保 证 每 次 对 p i n g 调 用 所 使 用 的 t 值 都 严 格 递 增 保证每次对 ping 调用所使用的 t 值都 严格递增 ping使t
  • 至 多 调 用 p i n g 方 法 1 0 4 次 至多调用 ping 方法 10^4 次 ping104

七【解题思路】

  • 题目比较难理解,其实就是一个队列,我们只要[t-3000,t]这个区间的值,每次来新的值我们只需要区间向前移动即可(因为题目说t递增),所以区间前移之后,区间左端点的值就是最小的,将队列头中所有小于区间左端元素值的元素全都poll出去,然后队列长度即可

八【时间频度】

  • 时间复杂度: O ( N ) O(N) O(N)

九【代码实现】

  1. Java语言版
package Queue;

import java.util.LinkedList;
import java.util.Queue;

public class p933_NumberOfRecentCalls {

    // 创建队列
    private static Queue<Integer> queue;

    public static void main(String[] args) {
        RecentCounter();
        int ping1 = ping(1);
        int ping2 = ping(100);
        int ping3 = ping(3001);
        int ping4 = ping(3002);
        System.out.println(ping1 + " " + ping2 + " " + ping3 + " " + ping4);
    }

    public static void RecentCounter() {
        // 初始化队列
        queue = new LinkedList<>();
    }

    public static int ping(int t) {
        // 首先将当前值加入队列
        queue.offer(t);
        // 然后开始循环把不在[t-3000,t]这个范围的值poll出
        while (queue.peek() < t - 3000) {
            queue.poll();
        }
        // 最后返回当前队列的个数
        return queue.size();
    }

}
  1. C语言版
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAXSIZE 10000 /*队列最大长度*/

typedef struct
{
	int *data;
	int front; /*头指针*/
	int rear; /*尾指针,若队列不空,指向队列尾元素的下一个位置*/
}RecentCounter;

/*初始化队列*/
RecentCounter* recentCounterCreate()
{
	RecentCounter* queue = (RecentCounter *)malloc(sizeof(RecentCounter));
	queue->data = (int *)calloc(MAXSIZE, sizeof(int));
	queue->front = 0;
	queue->rear = 0;
	return queue;
}

/*ping的函数*/
int recentCounterPing(RecentCounter* obj, int t)
{
	/*首先将当前值加入队列*/
	obj->data[obj->rear++] = t;
	/*然后开始循环把不在[t-3000,t]这个范围的值"弹"出*/
	while (obj->data[obj->front] < t - 3000)
	{
		obj->front++;
	}
	/*最后返回当前队列的个数*/
	return obj->rear - obj->front;
}

/*释放资源*/
void recentCounterFree(RecentCounter* obj)
{
	free(obj->data);
	free(obj);
}

int main(void)
{
	/*主函数省略*/
}

十【提交结果】

  1. Java语言版
    在这里插入图片描述
  2. C语言版
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值