Skip to content

Instantly share code, notes, and snippets.

@zhangxin0804
Created June 29, 2015 06:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zhangxin0804/80fac5b6893be3823766 to your computer and use it in GitHub Desktop.
Save zhangxin0804/80fac5b6893be3823766 to your computer and use it in GitHub Desktop.
CC150 3.7
/*
3.7
An animal shelter holds only dogs and cats, and operates on a strictly "first in, first out" basis.
People must adopt either the "oldest" (based on arrival time) of all animals at the shelter, or
they can select whether they would prefer a dog or a cat (and will receive the oldest animal of that type).
They cannot select which specific animal they would like. Create the data structures to maintain this system and implement
operations such as enqueue, dequeueAny, dequeueDog and dequeueCat.You may use the built-in LinkedList data structure.
*/
/*
解析:
这题略偏design, 由于Java OO的东西有点儿遗忘, 于是参考了下java相关资料。
首先时间戳timestamp用int来代替, 时间戳小的表示older. 使用LinkedList实现的2个Queue来模拟dogs和cats.
dequeueAny的时候,要记得先判断当前是否有dogs或者cats已经为空。如果有为空的,则从不为空的dequeue, 如果都为空
则进行比较哪个更加older就dequeue哪个。
enqueue操作利用java的多态性,再引入一个字符串用于判断具体所指对象类型 (后来发现可以用instanceof)
*/
// 时间复杂度:O(1)
// 空间复杂度:O(N)
package cc150Test;
import java.util.Queue;
import java.util.LinkedList;
class Animal{
private int timestamp;
private String type;
public Animal(int val, String animalType){
timestamp = val;
type = animalType;
}
public int getTimestamp(){
return timestamp;
}
public String getAnimalType(){
return type;
}
}
class Dog extends Animal{
public Dog(int val, String animalType){
super(val,animalType);
}
}
class Cat extends Animal{
public Cat(int val, String animalType){
super(val,animalType);
}
}
class AnimalShelter{
Queue<Dog> dogs;
Queue<Cat> cats;
public AnimalShelter(){
dogs = new LinkedList<Dog>();
cats = new LinkedList<Cat>();
}
public void enqueue(Animal animal){
if( animal.getAnimalType().equals("Dog")){
dogs.offer((Dog)animal);
}else if( animal.getAnimalType().equals("Cat")){
cats.offer((Cat)animal);
}
}
public Animal dequeueAny(){
if( dogs.size() == 0 && cats.size() != 0 ){
return cats.poll();
}
if( cats.size() == 0 && dogs.size() != 0 ){
return dogs.poll();
}
if( cats.size() != 0 && dogs.size() != 0){
return dogs.peek().getTimestamp() > cats.peek().getTimestamp() ? cats.poll() : dogs.poll();
}
return null;
}
public Dog dequeueDog(){
if( dogs.size() != 0 ){
return dogs.poll();
}
return null;
}
public Cat dequeueCat(){
if( cats.size() != 0 ){
return cats.poll();
}
return null;
}
}
public class Test {
public static void main(String[] args) {
AnimalShelter shelter = new AnimalShelter();
shelter.enqueue(new Dog(1,"Dog"));
shelter.enqueue(new Dog(2,"Dog"));
shelter.enqueue(new Dog(3,"Dog"));
shelter.enqueue(new Cat(4,"Cat"));
shelter.enqueue(new Cat(5,"Cat"));
shelter.enqueue(new Cat(6,"Cat"));
shelter.enqueue(new Dog(7,"Dog"));
shelter.enqueue(new Cat(8,"Cat"));
Animal resultAnimal = shelter.dequeueAny();
System.out.println(" Dequeue Any Result: " + resultAnimal.getAnimalType() + " " + "id #" + resultAnimal.getTimestamp());
resultAnimal = shelter.dequeueAny();
System.out.println(" Dequeue Any Result: " + resultAnimal.getAnimalType() + " " + "id #" + resultAnimal.getTimestamp());
Dog resultDog = shelter.dequeueDog();
System.out.println(" Dequeue Dog Result: " + resultDog.getAnimalType() + " " + "id #" + resultDog.getTimestamp());
Cat resultCat = shelter.dequeueCat();
System.out.println(" Dequeue Cat Result: " + resultCat.getAnimalType() + " " + "id #" + resultCat.getTimestamp());
resultDog = shelter.dequeueDog();
System.out.println(" Dequeue Dog Result: " + resultDog.getAnimalType() + " " + "id #" + resultDog.getTimestamp());
resultAnimal = shelter.dequeueAny();
System.out.println(" Dequeue Any Result: " + resultAnimal.getAnimalType() + " " + "id #" + resultAnimal.getTimestamp());
resultAnimal = shelter.dequeueAny();
System.out.println(" Dequeue Any Result: " + resultAnimal.getAnimalType() + " " + "id #" + resultAnimal.getTimestamp());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment