933最近的请求次数

P0PC%BM%}~IM(~H_X8FR~Z3.png2P8@GN%}3A`@1VA6D%}KL@Q.png

思路

假设在第 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() 即可。

代码

  1. class RecentCounter:
  2. def __init__(self):
  3. self.q = collections.deque()
  4. def ping(self, t: int) -> int:
  5. self.q.append(t)
  6. while self.q[0] < t - 3000:
  7. self.q.popleft()
  8. return len(self.q)
  1. class RecentCounter {
  2. private Deque<Integer> q;
  3. public RecentCounter() {
  4. q = new LinkedList<>();
  5. }
  6. public int ping(int t) {
  7. q.offerLast(t);
  8. while (q.peekFirst() < t - 3000) {
  9. q.pollFirst();
  10. }
  11. return q.size();
  12. }
  13. }


225. 用队列实现栈

XCAQ1S8K1@U)X46P2P6R0(I.png0$I`T(QQQ4(BV`7`H]@AM`8.png

思路

根据题意,要用两个队列来实现栈,首先队列是先进先出,栈是后进先出。
因此两个队列的用处一目了然。一个队列为主队列,一个为辅助队列,当入栈操作时,我们先将主队列内容导入辅助队列,然后将入栈元素放入主队列队头位置,再将辅助队列内容,依次添加进主队列即可。

代码

  1. class MyStack:
  2. def __init__(self):
  3. """
  4. Initialize your data structure here.
  5. """
  6. self.queue1 = collections.deque()
  7. self.queue2 = collections.deque()
  8. def push(self, x: int) -> None:
  9. """
  10. Push element x onto stack.
  11. """
  12. self.queue2.append(x)
  13. while self.queue1:
  14. self.queue2.append(self.queue1.popleft())
  15. self.queue1, self.queue2 = self.queue2, self.queue1
  16. def pop(self) -> int:
  17. """
  18. Removes the element on top of the stack and returns that element.
  19. """
  20. return self.queue1.popleft()
  21. def top(self) -> int:
  22. """
  23. Get the top element.
  24. """
  25. return self.queue1[0]
  26. def empty(self) -> bool:
  27. """
  28. Returns whether the stack is empty.
  29. """
  30. return not self.queue1
  1. class MyStack {
  2. Queue<Integer> queue1;
  3. Queue<Integer> queue2;
  4. public MyStack() {
  5. queue1 = new LinkedList<Integer>();
  6. queue2 = new LinkedList<Integer>();
  7. }
  8. public void push(int x) {
  9. queue2.offer(x);
  10. while (!queue1.isEmpty()) {
  11. queue2.offer(queue1.poll());
  12. }
  13. Queue<Integer> temp = queue1;
  14. queue1 = queue2;
  15. queue2 = temp;
  16. }
  17. public int pop() {
  18. return queue1.poll();
  19. }
  20. public int top() {
  21. return queue1.peek();
  22. }
  23. public boolean empty() {
  24. return queue1.isEmpty();
  25. }
  26. }