题目:
有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。
给定一个操作序列int[][2] ope(C++中为vector<vector<int>>)代表所有事件。若第一个元素为1,则代表有动物进入收容所,第二个元素为动物的编号,正数代表狗,负数代表猫;若第一个元素为2,则代表有人收养动物,第二个元素若为0,则采取第一种收养方式,若为1,则指定收养狗,若为-1则指定收养猫。请按顺序返回收养的序列。若出现不合法的操作,即没有可以符合领养要求的动物,则将这次领养操作忽略。
思路:
我选择使用链表LinkedList结构作收容所,收养时按序add到末尾,领养时从头开始,先判断是哪种领养方式,若是第一种,直接链表头结点出,若是猫或狗,则根据判断正负找到最早进入加入链表的猫或狗所在的index,删除链表中的index节点并加入到领养序列。
踏过的坑:
1.注意Switch-Case的使用,每个Case之后都要带break;否则不管接下来的Case是否符合条件都会一直执行下去
2.index的设置,当收容所即LinkedList中可能暂时不存在符合领养的猫或狗,如某人要领养狗,但当前收容所内只存在猫,这样的话是找不到最早进入收容所的狗存在的index的,此种情况要考虑到,index=-1表示不存在符合领养条件的猫或狗。所以选择性领养猫或狗时,不光要满足整个大条件,即收容所内存在动物,且只有index不等于-1时,才能进行领养。否则不能进行领养,领养失败。
3.Switch-Case使用事项:
switch 语句只能够测试是否相等,因此,case 语句后面只能是整型或字符型的常量或常量表达式;
而在 if 语句中还能够测试关系与逻辑表达式。
(1)不要忘记在 case 语句的结尾添加 break 语句
每个 case 语句的结尾不要忘记添加 break 语句,否则将导致多个分支重叠。除非有意使多个分支重叠。
(2)不要忘记在 switch 语句的结尾添加 default 语句
default 语句主要用于检查默认情况,或者处理错误情况,若去掉 default 语句, switch 语句将失去对默认情况与错误情况的处理能力。即使程序真的不需要 default 处理,也应该保留此语句。
代码:
import java.util.*;
public class CatDogAsylum {
public int findFirstPositive(LinkedList<Integer> qAll){ //狗
int index = -1;
if(qAll.size()> 0){
for(int i=0; i< qAll.size();i++){
if(qAll.get(i) > 0){
index =i;
break;
}
}
}
return index;
}
public int findFirstNegitive(LinkedList<Integer> qAll){ //猫
int index = -1;
if(qAll.size()> 0){
for(int i=0;i< qAll.size();i++){
if(qAll.get(i) < 0){
index=i;
break;
}
}
}
return index;
}
public ArrayList<Integer> asylum(int[][] ope) {
LinkedList<Integer> qAll = new LinkedList<Integer>();
ArrayList<Integer> seqAdopt = new ArrayList<Integer>();
// 队列
for(int i=0;i<ope.length;i++){
if(ope[i][0] == 1){
//入收容所,入队列
qAll.add(ope[i][1]);
}else if(ope[i][0] == 2){
//领养,出队列
if(qAll.size()> 0){
switch(ope[i][1]){
case 0:
Integer first = qAll.removeFirst();
seqAdopt.add(first);
break;
case 1:
int indexP = this.findFirstPositive(qAll);
if(indexP != -1){
Integer firstDog = qAll.remove(indexP);
seqAdopt.add(firstDog);
}
break;
case -1:
int indexN = this.findFirstNegitive(qAll);
if(indexN != -1){
Integer firstCat = qAll.remove(indexN);
seqAdopt.add(firstCat);
}
break;
}
}
}
}
return seqAdopt;
}
}