题目来源:
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){ //catanimal[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();*/
总结:
有点取巧,在数据量足够大时,收容时间会变为负数从而导致发生错误。
无官方题解。