《程序员面试金典》☞ 猫狗收容所

题目:

有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。

       给定一个操作序列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;        
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值