CC17:猫狗收容所

题目

有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。
给定一个操作序列int[][2] ope(C++中为vector<vector>)代表所有事件。若第一个元素为1,则代表有动物进入收容所,第二个元素为动物的编号,整数代表狗,负数代表猫;若第一个元素为2,则代表有人收养动物,第二个元素若为0,则采取第一种收养方式,若为1,则指定收养狗,若为-1则指定收养猫。请按顺序返回收养的序列。若出现不合法的操作,即没有可以符合领养要求的动物,则将这次领养操作忽略。
测试样例:

[[1,1],[1,-1],[2,0],[2,-1]]
返回:[1,-1]

解法

使用两个队列来完成所有的操作,对于第一种操作,我们只需要返回队列中第一个元素即可;对于第二个操作,我们就将所有不符合要求的数据存入辅助队列中,一直找到第一个满足条件的元素,那么就删除,然后再将辅助队列所有元素又归还原队列.而我们所需要做的就是判断每个数据的第一个元素,根据不同的值选择不同的情况;跟军数据的第二个元素确定是猫还是狗。

class CatDogAsylum {
public:
    vector<int> asylum(vector<vector<int> > ope) {
        // write code here
        vector<int> res;
        if(ope.size()==0)
            return res;
        for(int i=0;i<ope.size();i++)
        {
            if(ope[i][0]==1)
            {
                q1.push(ope[i][1]);
            }
            else
            {
                if(ope[i][1]==0)
                {
                    if(!q1.empty())
                    {
                        res.push_back(q1.front());
                        q1.pop();
                    }
                }
                else
                {
                    while(!q1.empty())
                    {
                        if((ope[i][1]<0 && q1.front()<0)||(ope[i][1]>0 && q1.front()>0))
                        {
                            res.push_back(q1.front());
                            q1.pop();
                            break;
                        }
                        else
                        {
                            q2.push(q1.front());
                            q1.pop();
                        }
                    }
                    while(!q1.empty())
                    {
                        q2.push(q1.front());
                        q1.pop();
                    }
                    while(!q2.empty())
                    {
                        q1.push(q2.front());
                        q2.pop();
                    }
                }
                
            }
        }
        return res;
    }
    
private:
    queue<int> q1;
    queue<int> q2;
};
posted @ 2018-07-20 11:25  MrYun  阅读(254)  评论(0编辑  收藏  举报