我是靠谱客的博主 开心航空,最近开发中收集的这篇文章主要介绍动物收容所,先进先出,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

      有家动物收容所只收容狗与猫,且严格遵守“先进先出”原则。在收养该收容所的动物时,收养人只能收养进入收容所时间最长的动物,或者,挑选猫或狗中收养时间最长的。

请创建适合这个系统的数据结构,实现各种操作方法,比如enqueue,dequeueAny, dequeDog, dequeueCat等,允许使用Java内置的LinkedList数据结构

 

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

题目分析:

  根据先进先出的原则,自然想到了用队列实现,如果只维护一个队列,那么第一种方法实现起来比较简单,只需要取出队头的动物则可以,但是第二种方法就比较复杂,需要访问整个队列来找出第一个被访问的猫或者狗。

  因此我们可以选择维护两个队列来实现,一个队列存放放入的狗,一个队列存放放入的猫,对于第二种方法实现起来相当容易,我们只需要根据要选择的猫或者狗从 相应的队列中取出便可以,但是第一种方法需要判断那个两个队列头部的是猫先进入收容所,还是狗先进入,这个时候需要一个标志,所以我们每次把动物放入队列 的时候,同时将一个递增的序号放入队列,这个序号就是一个时间序列,根据这个序号便可以轻松实现第一种方法。

 

思路:

1、方法一:维护一个队列,dequeueAny实现简单,但是dequeueDog和dequeueDog需要迭代访问整个队列,才能找到第一只该被收养的猫或狗。

 

2、方法二:

 

[java] view plain copy

 

  1. /** 
  2.  * 方法二:为狗和猫各自建一个队列,然后将两者放进名为AnimalQueue的类中,并且存储某种形式的时间戳,来标记每只动物进入队列的时间。调用dequeueAny时,查看狗队列和猫队列的首部,并返回最老的那一只。 
  3.  */  
  4. import java.util.*;  
  5.   
  6. public class AnimalQueue {  
  7.       LinkedList<Dog> dogs= new LinkedList<Dog>();  
  8.       LinkedList<Cat> cats= new LinkedList<Cat>();  
  9.       private int order=0;//时间戳  
  10.   
  11.       public void enqueue(Animal a){  
  12.              a.setOrder( order);  
  13.              order++;  
  14.               
  15.              if( a instanceof Dog)  
  16.                    dogs.add((Dog) a);  
  17.              else if( a instanceof Cat)  
  18.                    cats.add((Cat) a);  
  19.       }  
  20.         
  21.       public Animal dequeueAny(){  
  22.              if( dogs.size()==0)  
  23.                    return dequeueCat();  
  24.              else if( cats.size()==0)  
  25.                    return dequeueDog();  
  26.               
  27.             Dog dog= dogs.peek(); //not remove  
  28.             Cat cat= cats.peek();  
  29.              if( dog.isOlderThan( cat))  
  30.                    return dequeueDog(); //此时需要remove,所以不能只是返回dog  
  31.              else  
  32.                    return dequeueCat();  
  33.       }  
  34.         
  35.       public Dog dequeueDog(){  
  36.              return dogs.poll(); //remove  
  37.       }  
  38.         
  39.       public Cat dequeueCat(){  
  40.              return cats.poll();  
  41.       }  
  42. }  
  43.   
  44. class Dog extends Animal{  
  45.       public Dog(String n) {  
  46.              super( n);  
  47.       }       
  48. }  
  49.   
  50. class Cat extends Animal{  
  51.       public Cat(String n) {  
  52.              super( n);  
  53.       }       
  54. }  
  55.   
  56. abstract class Animal{  
  57.       int order;  
  58.       String name;  
  59.         
  60.       public Animal(String n){  
  61.              this. name= n;  
  62.       }  
  63.   
  64.       public int getOrder() {  
  65.              return order;  
  66.       }  
  67.   
  68.       public void setOrder( int order) {  
  69.              this. order = order;  
  70.       }  
  71.         
  72.       public boolean isOlderThan(Animal a){  
  73.              return this.getOrder()< a.getOrder();  
  74.       }       

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

       给定一个操作序列int[][2] ope(C++中为vector<vector<int>>)代表所有事件。若第一个元素为1,则代表有动物 进入收容所,第二个元素为动物的编号,正数代表狗,负数代表猫;若第一个元素为2,则代表有人收养动物,第二个元素若为0,则采取第一种收养方式,若为 1,则指定收养狗,若为-1则指定收养猫。请按顺序返回收养的序列。若出现不合法的操作,即没有可以符合领养要求的动物,则将这次领养操作忽略。

测试样例:

[[1,1],[1,-1],[2,0],[2,-1]]
返回:[1,-1]

或者

public ArrayList<Integer> asylum(int[][] ope) {

        class Animal {

            int id, order;

 

            public Animal(int id, int order) {

                this.id = id;

                this.order = order;

            }

        }

        int order = 0;

        LinkedList<Animal> dogs = new LinkedList<>();

        LinkedList<Animal> cats = new LinkedList<>();

        ArrayList<Integer> list = new ArrayList<>();

        for (int i = 0; i < ope.length; i++) {

            if (ope[i][0] == 1) {

                if (ope[i][1] > 0)

                    dogs.add(new Animal(ope[i][1], order++));

                else if (ope[i][1] < 0)

                    cats.add(new Animal(ope[i][1], order++));

            }

 

            else if (ope[i][0] == 2) {

                if (ope[i][1] == 0) {

                    Animal d = dogs.peek();

                    Animal c = cats.peek();

                    boolean flag = false;

                    if (d != null && c != null) {

                        if (d.order - c.order < 0)

                            flag = true;

                    } else if (d == null && c == null)

                        continue;

                    else if (d != null)

                        flag = true;

 

                    if (flag)

                        list.add(dogs.removeFirst().id);

                    else

                        list.add(cats.removeFirst().id);

                } else if (ope[i][1] == 1) {

                    if (dogs.peek() != null)

                        list.add(dogs.removeFirst().id);

                } else if (ope[i][1] == -1) {

                    if (cats.peek() != null)

                        list.add(cats.removeFirst().id);

                }

            }

        }

        return list;

    }

 

或者:

import java.util.*;

 

public class CatDogAsylum {

    public ArrayList<Integer> asylum(int[][] ope) {

        // write code here

        ArrayList<Integer> result = new ArrayList<Integer>();

        if(null==ope||ope.length<=0)

            return result;

        ArrayList<Integer> temp = new ArrayList<Integer>();

        for(int i=0;i<ope.length;i++){

            if(ope[i][0]==1){//进入

                temp.add(ope[i][1]);

            }

            if(ope[i][0]==2){//收养

                if(ope[i][1]==0&&temp.size()>0)//采用第一种收养方式

                    result.add(temp.remove(0));

                else if(ope[i][1]==-1){//指定收养猫

                    for(int j=0;j<temp.size();j++){

                        if(temp.get(j)<0){

                            result.add(temp.remove(j));

                            break;

                        }

                    }

                }

                else if(ope[i][1]==1){//指定收养狗

                    for(int k=0;k<temp.size();k++){

                        if(temp.get(k)>0){

                            result.add(temp.remove(k));

                            break;

                        }

                    }

                }

            }

        }

        return result;

    }

}

转载于:https://my.oschina.net/u/2822116/blog/789495

最后

以上就是开心航空为你收集整理的动物收容所,先进先出的全部内容,希望文章能够帮你解决动物收容所,先进先出所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部