题解 | #猫狗队列#

猫狗队列

http://www.nowcoder.com/practice/8a7e04cff6a54b7095b94261d78108f5

1. 如何解决不能修改封装的类

  • 在实际的情况中,对于封装好的类往往不能修改其中的代码,如何对其增加属性呢? 即对其进行再封装

  • 在本题中,有两个类,他们有共同的父类,为了对两个类一起封装,采用了封装其共同父类的方法

class Pet {

    private String type;
    private int id;

    public Pet(String type, int id) {
        this.type = type;
        this.id = id;
    }

    public String getPetType() {
        return this.type;
    }

    public int getId(){
        return this.id;
    }

}

class Cat extends Pet {
    public Cat(int id){
        super("cat", id);

    }
}

class Dog extends Pet{
    public Dog(int id) {
        super("dog", id);
    }
}

// 创建一个类, 用于收容上述两个类
class PetEnter{
    // 增加一个变量,记录数量,作为时间戳
    private Pet pet;
    private long count;

    public PetEnter(Pet pet, long count) {
        this.pet = pet;
        this.count = count;
    }

    public Pet getPet() {
        return this.pet;
    }

    public long getCount() {
        return this.count;
    }

    public String getPetEnterType() {
        return this.pet.getPetType();
    }

}

2. 使用两个队列存放不同的类

  • 为了存放不同的两个类,一种办法是放到一个队列中,操作的时候,每一次都要出队,包括弹出队列,判断队列中的某一个类是否为空,时间复杂度较高

  • 使用“空间换时间”的思想,将两个类的对立队列封装好,使用时间戳的方式记录其进入队列的顺序,这样既可以操作总的序列,也可以单独操作不同的类


class DogCatQueue {

    private Queue<PetEnter> catQueue;
    private Queue<PetEnter> dogQueue;
    private long count;

    public DogCatQueue(){
        this.catQueue = new LinkedList<>();
        this.dogQueue = new LinkedList<>();
        this.count = 0;
    }

    public void add(Pet pet){

        // 按照类型放入动物队列中
        if (pet.getPetType().equals("dog")) {
            this.dogQueue.add(new PetEnter(pet, this.count++));
        } else if (pet.getPetType().equals("cat")) {
            this.catQueue.add(new PetEnter(pet, this.count++));
        } else {
            throw new RuntimeException("error no thus class");
        }


    }

    public Pet pollAll() {
        if (!this.catQueue.isEmpty() && !this.dogQueue.isEmpty()) {
            if (this.catQueue.peek().getCount() < this.dogQueue.peek().getCount()) {
                return this.catQueue.poll().getPet();
            } else {
                return this.dogQueue.poll().getPet();
            }
            // 否则就是其中一个为空
        } else if (!this.catQueue.isEmpty()) {
            return this.catQueue.poll().getPet();
        } else if (!this.dogQueue.isEmpty()) {
            return this.dogQueue.poll().getPet();
        } else{
            return null;
        }

    }

    public Pet pollDog() {
        if (!this.dogQueue.isEmpty()) {
            return this.dogQueue.poll().getPet();
        }
        return null;
    }

    public Pet pollCat() {
        if (!this.catQueue.isEmpty()) {
            return this.catQueue.poll().getPet();
        }
        return null;
    }

    public boolean isEmpty() {

        if (this.dogQueue.isEmpty() && this.catQueue.isEmpty()) {
            return true;
        }
        return false;
    }

    public boolean isDogEmpty() {
        if (this.dogQueue.isEmpty()) {
            return true;
        }
        return false;
    }

    public boolean isCatEmpty() {
        if (this.catQueue.isEmpty()) {
            return true;
        }
        return false;
    }


}

3. 按照要求进行输入输出

  • 读入一行字符串,按照要求进行分割字符串,识别其中的命令

  • 使用StringBuilder 来连接字符串

public class Main {

    public static void main(String[] args) throws IOException {

        DogCatQueue dogCatQueue = new DogCatQueue();

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine());

        // 保存结果的数组
        for (int i = 0; i < N; ++i) {
            StringBuilder result = new StringBuilder();
            String[] strArr = reader.readLine().split(" ");
            String option = strArr[0];
            switch (option) {
                case "add":
                    String type = strArr[1];
                    if (type.equals("dog")) {
                        int id = Integer.parseInt(strArr[2]);
                        dogCatQueue.add(new Pet("dog", id));
                    } else if (type.equals("cat")) {
                        int id = Integer.parseInt(strArr[2]);
                        dogCatQueue.add(new Pet("cat", id));
                    }
                    break;
                case "pollAll":
                    while (!dogCatQueue.isEmpty()) {
                        Pet pet = dogCatQueue.pollAll();
                        result.append(pet.getPetType()).append(" ").append(pet.getId()).append("\n");
                    }
                    System.out.print(result);
                    break;
                case "pollDog":
                    while (!dogCatQueue.isDogEmpty()) {
                        Pet pet = dogCatQueue.pollDog();
                        result.append(pet.getPetType()).append(" ").append(pet.getId()).append("\n");
                    }
                    System.out.print(result);
                    break;
                case "pollCat":
                    while (!dogCatQueue.isCatEmpty()) {
                        Pet pet = dogCatQueue.pollCat();
                        result.append(pet.getPetType()).append(" ").append(pet.getId()).append("\n");
                    }
                    System.out.print(result);
                    break;
                case "isDogEmpty":
                    System.out.println(dogCatQueue.isDogEmpty()? "yes" : "no");
                    break;
                case "isCatEmpty":
                    System.out.println(dogCatQueue.isCatEmpty()? "yes" : "no");
                    break;
                case "isEmpty":
                    System.out.println(dogCatQueue.isEmpty()? "yes" : "no");
                    break;
            }


        }
    }
}

全部评论

相关推荐

手撕没做出来是不是一定挂
Chrispp3:不会,写出来也不一定过
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
12-01 12:34
已编辑
广东工业大学 Java
如题,fw🐭🐭,加上准备的太晚,大三上已找不到日常实习,导致连锁反应,下学期的暑期实习找不到好的实习,导致秋招找不到中大厂,现在是中小厂Java还有考公的选择,由于有些中小厂工作强度比肩大厂,钱还少,感觉不如考公如果🐮u们是我现在这种情况,会怎么选?
负债的混子:关注你一段时间了,突然发现你头像名字都改了,想必是这段时间压力很大。关于就业还是考公的选择,就像很多牛友说的:不要美化自己没走过的路。你现在想往互联网发展,发现这条路很难走,然后想往考公发展,但是你没走过考公这条路,所以你不知道这条路的压力如何。你今年大三了,还有时间给你做选择,我希望你能够尽快的决定自己的方向,然后一条路走到黑,而不是在这里徘徊,每个人的道路是不一样的,你无法复刻别人的路,你能做的就是尽力的完善自己。 最后,我想说的是,加油,陌生人!
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务