题目来源:
leetcode题目,网址:面试题 03.06. 动物收容所 - 力扣(LeetCode)
解题思路:
使用两个队列分别记录猫狗信息。
收容:记录该动物是猫还是狗后,将猫狗标志修改为收容时间,然后在根据是猫是狗分别进入不同队列。
收养动物:若猫狗队列均为空,返回 [-1,-1];若猫队列为空,收养狗;若狗队列为空,收养猫;若均不空,查看猫队列和狗队列首个元素的收容时间,收养较小者。
收养狗:若狗队列为空,返回 [-1,-1];否则收养队首狗,弹出队首元素有将收容时间修改为狗标志后返回。
收养猫:若猫队列为空,返回 [-1,-1];否则收养队首猫,弹出队首元素有将收容时间修改为猫标志后返回。
解题代码:
class AnimalShelf {
queue<vector<int>> dog;
queue<vector<int>> cat;
int time=0;
public:
AnimalShelf() {
while(!dog.empty()){
dog.pop();
}
while(!cat.empty()){
cat.pop();
}
int time=0;
}
void enqueue(vector<int> animal) {
if(animal[1]==0){ //cat
animal[1]=time;
cat.push(animal);
}else{
animal[1]=time;
dog.push(animal);
}
time++;
}
vector<int> dequeueAny() {
if(cat.size()==0 && dog.size()==0){
vector<int> res;
res.push_back(-1);
res.push_back(-1);
return res;
}else if(cat.size()==0){
return dequeueDog();
}else if(dog.size()==0){
return dequeueCat();
}
vector<int> theDog=dog.front();
vector<int> theCat=cat.front();
if(theCat[1]<theDog[1]){
return dequeueCat();
}else{
return dequeueDog();
}
}
vector<int> dequeueDog() {
if(dog.size()==0){
vector<int> res;
res.push_back(-1);
res.push_back(-1);
return res;
}
vector<int> res=dog.front();
dog.pop();
res[1]=1;
return res;
}
vector<int> dequeueCat() {
if(cat.size()==0){
vector<int> res;
res.push_back(-1);
res.push_back(-1);
return res;
}
vector<int> res=cat.front();
cat.pop();
res[1]=0;
return res;
}
};
/**
* Your AnimalShelf object will be instantiated and called as such:
* AnimalShelf* obj = new AnimalShelf();
* obj->enqueue(animal);
* vector<int> param_2 = obj->dequeueAny();
* vector<int> param_3 = obj->dequeueDog();
* vector<int> param_4 = obj->dequeueCat();
*/
总结:
有点取巧,在数据量足够大时,收容时间会变为负数从而导致发生错误。
无官方题解。