【程序员面试金典】猫狗收容所

一.题目描述
有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。
给定一个操作类似二维数组的结构,若第一个元素为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;
    }
};

在这里就分享结束了~~~

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值