题目:
思路:
用代码模拟挑选过程,思路都在代码里
- 先对ops的第一个元素进行判断,是1则入收容所,是2则分为3种情况领养动物(领养最早的猫或狗可合并为一种情况)
- 注意过程中对list自带方法的应用
- 注意细节,在最后一个循环中,由于不确定第一只猫或狗在list中出现的位置,所以需要remove(j)而不是remove(0);
代码:
import java.util.*;
import java.util.ArrayList;
import java.util.LinkedList;
public class CatDogAsylum {
//猫狗收容所
public ArrayList<Integer> asylum(int[][] ope) {
// list用来存储入收容所的猫狗,res用来存储出收容所的动物
List<int[]> list = new LinkedList<>();
ArrayList<Integer> res = new ArrayList<>();
for (int [] i :ope){
//如果i[0]=1,代表动物进收容所
if (i[0] == 1){
list.add(i);
}
else if (i[0] == 2) {
//说明动物要出收容所,有3种情况
if (i[1] == 0) {
//采取第一种方式收养,收养最先入收容所的动物不论猫狗
//前提收容所中有动物
if (!list.isEmpty()) {
int[] animal = list.remove(0);
//animal数组中存的就是第一只动物的信息[入还是出,猫还是狗],
// 此时下标为1的元素就是动物的身份
res.add(animal[1]);
}
} else {
//采取第2,3种收养方式(-1代表收养猫,1代表收养狗)
for (int j = 0; j < list.size(); j++) {
//如果收养猫并且收养所中有猫||收养狗并且收容所里面有狗,
// 就将对应的动物出收容所,并添加到res中去
if (i[1] == -1 && list.get(j)[1] < 0 || i[1] == 1 && list.get(j)[1] >0){
//list.get(j)得到的是对应j下标的list一维数组,
// list.get(j)[1],得到的是该一维数组的下标为1的元素
int [] animal = list.remove(j);
res.add(animal[1]);
//已经找到出收容所的动物了,后面的就不需要再判断了
break;
}
}
}
}
}
return res;
}
}