面试题 03.06. 动物收容所(简单)
题目描述
动物收容所。有家动物收容所只收容狗与猫,且严格遵守“先进先出”的原则。在收养该收容所的动物时,收养人只能收养所有动物中“最老”(由其进入收容所的时间长短而定)的动物,或者可以挑选猫或狗(同时必须收养此类动物中“最老”的)。换言之,收养人不能自由挑选想收养的对象。请创建适用于这个系统的数据结构,实现各种操作方法,比如enqueue、dequeueAny、dequeueDog和dequeueCat。允许使用Java内置的LinkedList数据结构。 enqueue方法有一个animal参数,animal[0]代表动物编号,animal[1]代表动物种类,其中 0 代表猫,1 代表狗。 dequeue*方法返回一个列表[动物编号, 动物种类],若没有可以收养的动物,则返回[-1,-1]。
示例1
输入: ["AnimalShelf", "enqueue", "enqueue", "dequeueCat", "dequeueDog", "dequeueAny"] [[], [[0, 0]], [[1, 0]], [], [], []] 输出: [null,null,null,[0,0],[-1,-1],[1,0]]
示例2
输入: ["AnimalShelf", "enqueue", "enqueue", "enqueue", "dequeueDog", "dequeueCat", "dequeueAny"] [[], [[0, 0]], [[1, 0]], [[2, 1]], [], [], []] 输出: [null,null,null,null,[2,1],[0,0],[1,0]]
做题思路
定义两个队列,分别存放猫和狗的信息,队列中元素为数组,存放的是动物的编号和种类。此题应该注意动物的编号是自增的,先来的动物编号小于后来的动物编号,在dequeueAny时以此作为出队的依据。
代码
class AnimalShelf { Deque<int[]> cat; //定义猫猫队列,队列中元素为数组,存放的是猫猫编号和种类 Deque<int[]> dog; //定义狗狗队列,队列中元素为数组,存放的是狗狗编号和种类 public AnimalShelf() { cat=new LinkedList<>(); //猫猫队列初始化 dog=new LinkedList<>(); //狗狗队列初始化 } public void enqueue(int[] animal) { //由于animal存放的是动物编号和种类,所以通过判断种类(0为cat,1为dog)入队 if(animal[1]==0){ cat.add(animal); }else{ dog.add(animal); } } public int[] dequeueAny() { //若猫狗队列均为空则返回[-1,-1] if(cat.isEmpty()&&dog.isEmpty()){ return new int[]{-1,-1}; } //猫猫队列为空,将狗狗队列出队 if(cat.isEmpty()){ return dog.poll(); } //狗狗队列为空,将猫猫队列出队 if(dog.isEmpty()){ return cat.poll(); } //判断猫狗队列的头元素的编号谁大谁小,编号小的一定是先来的,根据题目要求将该元素出队 if(cat.peek()[0]<dog.peek()[0]){ return cat.poll(); } return dog.poll(); } public int[] dequeueDog() { if(dog.isEmpty()){ return new int[]{-1,-1}; } return dog.poll(); } public int[] dequeueCat() { if(cat.isEmpty()){ return new int[]{-1,-1}; } return cat.poll(); } } /** * Your AnimalShelf object will be instantiated and called as such: * AnimalShelf obj = new AnimalShelf(); * obj.enqueue(animal); * int[] param_2 = obj.dequeueAny(); * int[] param_3 = obj.dequeueDog(); * int[] param_4 = obj.dequeueCat(); */
上一篇:
IDEA上Java项目控制台中文乱码