题目描述
有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。
给定一个操作序列int[][2] ope代表所有事件。若第一个元素为1,则代表有动物进入收容所,第二个元素为动物的编号,正数代表狗,负数代表猫;若第一个元素为2,则代表有人收养动物,第二个元素若为0,则采取第一种收养方式,若为1,则指定收养狗,若为-1则指定收养猫。请按顺序返回收养的序列。若出现不合法的操作,即没有可以符合领养要求的动物,则将这次领养操作忽略。
测试样例:
[[1,1],[1,-1],[2,0],[2,-1]]
返回:[1,-1]
用两个队列来实现。
import java.util.*;
public class CatDogAsylum {
ArrayList<Integer> list;
LinkedList<Cat> cats=new LinkedList();
LinkedList<Dog> dogs=new LinkedList();
int order=0;
public ArrayList<Integer> asylum(int[][] ope) {
list=new ArrayList<Integer>();
for(int i=0;i<ope.length;i++){
if(ope[i][0]==1){
enqueue(ope[i][1]);
}else if(ope[i][0]==2){
if(ope[i][1]==0)
dequeueAny();
else if(ope[i][1]==1){//狗
dequeueDog();
}else if(ope[i][1]==-1){//猫
dequeueCat();
}
}
}
return list;
}
private void dequeueAny(){
if(cats.size()==0&&dogs.size()!=0){
dequeueDog();
}else if(dogs.size()==0&&cats.size()!=0){
dequeueCat();
}else if(dogs.size()!=0&&cats.size()!=0){
if(cats.peek().getTime()<dogs.peek().getTime()){
dequeueCat();
}else{
dequeueDog();
}
}
}
private void dequeueCat(){
if(cats.size()!=0){
list.add(cats.poll().getName());
}
}
private void dequeueDog(){
if(dogs.size()!=0){
list.add(dogs.poll().getName());
}
}
private void enqueue(int type){
if(type>0){
enqueueDog(new Dog(type,order++));
}else if(type<0){
enqueueCat(new Cat(type,order++));
}
}
private void enqueueCat(Cat cat){
cats.addLast(cat);
}
private void enqueueDog(Dog dog){
dogs.addLast(dog);
}
}
class Cat extends Animal{
Cat(int name,int time){
super(name,time);
}
public int getTime(){
return time;
}
public int getName(){
return name;
}
}
class Dog extends Animal{
Dog(int name,int time){
super(name,time);
}
public int getTime(){
return time;
}
public int getName(){
return name;
}
}
abstract class Animal{
protected int name;
protected int time;
Animal(int name,int time){
this.name=name;
this.time=time;
}
}
最后
以上就是明理雨最近收集整理的关于程序员面试金典题解 猫狗收容所的全部内容,更多相关程序员面试金典题解内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复