一.题目描述
有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。
给定一个操作类似二维数组的结构,若第一个元素为1,则代表有动物进入收容所,第二个元素为动物的编号,正数代表狗,负数代表猫;若第一个元素为2,则代表有人收养动物,第二个元素若为0,则采取第一种收养方式,若为1,则指定收养狗,若为-1则指定收养猫。请按顺序返回收养的序列。若出现不合法的操作,即没有可以符合领养要求的动物,则将这次领养操作忽略。
二.问题分析
因为收养的规则是收养先来的动物所以考虑到使用队列来实现,对于第一种收养规则,我们只需要通过判断此时进来的是猫还是狗再将其队列中的第一个元素返回即可;那仫对于第二种收养规则呢?我们就将所有不符合要求的数据存入辅助队列中,一直找到第一个满足条件的元素,那么就删除,然后再将辅助队列所有元素又归还原队列。
操作如下:
1).第一个元素为1,代表有动物进入收容所。如果是正数代表狗,此时狗队列就要插入数据,如果是负数则代表此时有猫前来,则猫队列就要插入数据;在这里使用了一个变量index代表某种动物的进入次序;
2).第一个元素为2则代表有人收养动物。第二个元素若为0,则采取第一种收养方式,通过判断两种动物的进入时间来判定收养哪一种动物;若为1,则指定收养狗;若为-1则指定收养猫;
三.代码实现
class CatDogAsylum {
public:
vector<int> asylum(vector<vector<int>> ope) {
// write code here
queue<int> cat;
queue<int> dog;
vector<int> tmp;
int index=0; //指定先来后到的顺序
int len=ope.size();
for(int i=0;i<len;i++)
{
switch(ope[i][0])
{
case 1: //有动物进入
if(ope[i][1] >= 0){ //正数代表狗
dog.push(index++);
dog.push(ope[i][1]);
}
else{ //负数代表猫
cat.push(index++);
cat.push(ope[i][1]);
}
break;
case 2: //有人收养动物
if(ope[i][1] == 0){ //采用第一种收养方式
//比较两种动物的进入时间
int time=0;
if(!cat.empty() && !dog.empty()) //猫狗队列都不为空
time=dog.front() > cat.front() ? -1 : 1;
else if(!cat.empty() && dog.empty())//狗队列为空猫队列不为空
time=-1;
else if(cat.empty() && !dog.empty())//猫队列为空狗队列不为空
time=1;
if(time == -1){ //猫先来先收养猫
cat.pop();
tmp.push_back(cat.front());
cat.pop();
}
if(time == 1){ //狗先来先收养狗
dog.pop();
tmp.push_back(dog.front());
dog.pop();
}
}
else if(ope[i][1] == 1){ //指定收养狗
if(!dog.empty()){
dog.pop();
tmp.push_back(dog.front());
dog.pop();
}
}
else{ //指定收养猫
if(!cat.empty()){
cat.pop();
tmp.push_back(cat.front());
cat.pop();
}
}
break;
}
}
return tmp;
}
};
在这里就分享结束了~~~