题目描述
有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。
给定一个操作序列int[][2] ope(C++中为vector<vector<int>>)代表所有事件。若第一个元素为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>A;
vector<int>B;
for (int i = 0; i < ope.size(); i++) {
if (ope[i][0] == 1) {
A.push_back(ope[i][1]);
}
else {
if (A.empty())
continue;
else {
if (ope[i][1] == 0) {
if (A.size() == 0)
continue;
else {
B.push_back(A[0]);
A.erase(A.begin());
}
}
if (ope[i][1] >0) {//赵构
for (int i = 0; i < A.size(); i++) {
if (A[i] >0) {
B.push_back(A[i]);
A.erase(A.begin() + i);
break;
}
}
}
if (ope[i][1] <0) {//找猫
for (int i = 0; i < A.size(); i++) {
if (A[i] <0) {
B.push_back(A[i]);
A.erase(A.begin() + i);
break;
}
}
}
}
}
}
return B;
}
};
思路:
定义两个vector对象A和B,分别用于存放收容所里的动物和被收养的动物
操作如下:
对ope数组从按行从i = 0 ~ ope.size() -1遍历
1、指令为1(ope[i][0] = 1)时,即有动物进来,则将动物序号压入A–执行A.push_back(ope[i][1]);
2、指令为2(ope[i][0] = 2)时,即有动物被收养,此时首先判断A是否为空,即是否有动物
1)如果A为空,则continue
2)如果A不为空
1.如果操作为ope[i][1] = 0,即收养最先进来的动物,则将A[0]压入B,执行B.push_back(A[0]),然后在A中删除对应元素,即执行A.erase(A.begin());
2.如果操作为ope[i][1] = 1,即收养最先进来的狗,此时遍历A找到第一个狗,然后将找到的元素压入B,再在A中删除对应元素;
3.如果操作为ope[i][1] = -1,即收养最先进来的猫,此时遍历A找到第一个猫,然后将找到的元素压入B,再在A中删除对应的元素。
遍历完成之后,返回B。