933最近的请求次数
思路
假设在第 1、100、3001、3002 这四个时间点分别进行了 ping 请求, 在 3001 秒的时候, 它前面的 3000 秒指的是区间 [1,3001], 所以一共是有 1、100、3001 三个请求, t = 3002 的前 3000 秒指的是区间 [2,3002], 所以有 100、3001、3002 三次请求。
可用双端队列实现。每次将 t 进入队尾,同时从队头开始依次移除小于 t-3000 的元素。然后返回队列的大小 q.size() 即可。
代码
class RecentCounter:def __init__(self):self.q = collections.deque()def ping(self, t: int) -> int:self.q.append(t)while self.q[0] < t - 3000:self.q.popleft()return len(self.q)
class RecentCounter {private Deque<Integer> q;public RecentCounter() {q = new LinkedList<>();}public int ping(int t) {q.offerLast(t);while (q.peekFirst() < t - 3000) {q.pollFirst();}return q.size();}}
225. 用队列实现栈
思路
根据题意,要用两个队列来实现栈,首先队列是先进先出,栈是后进先出。
因此两个队列的用处一目了然。一个队列为主队列,一个为辅助队列,当入栈操作时,我们先将主队列内容导入辅助队列,然后将入栈元素放入主队列队头位置,再将辅助队列内容,依次添加进主队列即可。
代码
class MyStack:def __init__(self):"""Initialize your data structure here."""self.queue1 = collections.deque()self.queue2 = collections.deque()def push(self, x: int) -> None:"""Push element x onto stack."""self.queue2.append(x)while self.queue1:self.queue2.append(self.queue1.popleft())self.queue1, self.queue2 = self.queue2, self.queue1def pop(self) -> int:"""Removes the element on top of the stack and returns that element."""return self.queue1.popleft()def top(self) -> int:"""Get the top element."""return self.queue1[0]def empty(self) -> bool:"""Returns whether the stack is empty."""return not self.queue1
class MyStack {Queue<Integer> queue1;Queue<Integer> queue2;public MyStack() {queue1 = new LinkedList<Integer>();queue2 = new LinkedList<Integer>();}public void push(int x) {queue2.offer(x);while (!queue1.isEmpty()) {queue2.offer(queue1.poll());}Queue<Integer> temp = queue1;queue1 = queue2;queue2 = temp;}public int pop() {return queue1.poll();}public int top() {return queue1.peek();}public boolean empty() {return queue1.isEmpty();}}


