题目

image.png
image.png

思路

使用双端队列来实现,具体看代码注释

  1. import collections
  2. class AnimalShelf:
  3. def __init__(self):
  4. # 先进先出:队列
  5. # 出队狗或者猫,先把其他动物用一个数组保存,找到需要的东西,
  6. # 再把临时数组加到队列上
  7. # 用双端队列实现
  8. self.deque = collections.deque()
  9. def enqueue(self, animal: List[int]) -> None:
  10. self.deque.append(animal)
  11. def dequeueAny(self) -> List[int]:
  12. if self.is_empty():
  13. return [-1, -1]
  14. return self.deque.popleft()
  15. def dequeueDog(self) -> List[int]:
  16. return self.dequeueClass(class_id=1)
  17. def dequeueCat(self) -> List[int]:
  18. return self.dequeueClass(class_id=0)
  19. def dequeueClass(self, class_id) -> List[int]:
  20. if self.is_empty():
  21. return [-1, -1]
  22. tmp = []
  23. while self.deque[0][1] != class_id:
  24. tmp.append(self.deque.popleft())
  25. if self.is_empty():
  26. for i in tmp[::-1]:
  27. self.deque.appendleft(i)
  28. return [-1, -1]
  29. # 找到最老的小狗
  30. ans = self.deque.popleft()
  31. # 把tmp返回
  32. for i in tmp[::-1]:
  33. self.deque.appendleft(i)
  34. return ans
  35. def is_empty(self):
  36. return not self.deque
  37. # Your AnimalShelf object will be instantiated and called as such:
  38. # obj = AnimalShelf()
  39. # obj.enqueue(animal)
  40. # param_2 = obj.dequeueAny()
  41. # param_3 = obj.dequeueDog()
  42. # param_4 = obj.dequeueCat()