当前位置:网站首页>猫狗队列
猫狗队列
2022-06-28 13:46:00 【华为云】
猫狗队列
【题目】
宠物、狗和猫的类如下:

实现一种狗猫队列的结构,要求如下:
● 用户可以调用add方法将cat类或dog类的实例放入队列中;
● 用户可以调用pollAll方法,将队列中所有的实例按照进队列的先后顺序依次弹出;
● 用户可以调用pollDog方法,将队列中dog类的实例按照进队列的先后顺序依次弹出;
● 用户可以调用pollCat方法,将队列中cat类的实例按照进队列的先后顺序依次弹出;
● 用户可以调用isEmpty方法,检查队列中是否还有dog或cat的实例;
● 用户可以调用isDogEmpty方法,检查队列中是否有dog类的实例;
● 用户可以调用isCatEmpty方法,检查队列中是否有cat类的实例。
【思路】
本题考查实现特殊数据结构的能力以及针对特殊功能的算法设计能力。
本题为开放类型的面试题,希望读者能有自己的实现,在这里列出几种常见的设计错误:
● cat队列只放cat实例,dog队列只放dog实例,再用一个总队列放所有的实例。错误原因:cat、dog以及总队列的更新问题。
● 用哈希表,key表示一个cat实例或dog实例,value表示这个实例进队列的次序。错误原因:不能支持一个实例多次进队列的功能需求,因为哈希表的key只能对应一个value值。
● 将用户原有的cat或dog类改写,加一个计数项来表示某一个实例进队列的时间。错误原因:不能擅自改变用户的类结构。
本题实现将不同的实例盖上时间戳的方法,但是又不能改变用户本身的类,所以定义一个新的类,具体实现请参看如下的PetEnterQueue类。
【代码】
Pet
package pers.keafmd.accumulate.codeinterviewguide.catdogqueue;/** * Keafmd * * @ClassName: Pet * @Description: 宠物 * @author: 牛哄哄的柯南 * @date: 2022-06-22 19:45 */public class Pet { private String type; public Pet(String type) { this.type = type; } public String getType() { return type; } public void setType(String type) { this.type = type; }}Dog
package pers.keafmd.accumulate.codeinterviewguide.catdogqueue;/** * Keafmd * * @ClassName: Dog * @Description: 狗 * @author: 牛哄哄的柯南 * @date: 2022-06-22 19:29 */public class Dog extends Pet{ public Dog(String type) { super(type); }}Cat
package pers.keafmd.accumulate.codeinterviewguide.catdogqueue;/** * Keafmd * * @ClassName: Cat * @Description: 猫 * @author: 牛哄哄的柯南 * @date: 2022-06-22 19:31 */public class Cat extends Pet{ public Cat(String type) { super(type); }}PetEnterQueue
package pers.keafmd.accumulate.codeinterviewguide.catdogqueue;/** * Keafmd * * @ClassName: PetEnterQueue * @Description: * @author: 牛哄哄的柯南 * @date: 2022-06-22 19:33 */public class PetEnterQueue { private Pet pet; private long count; public PetEnterQueue(Pet pet, long count) { this.pet = pet; this.count = count; } public Pet getPet() { return pet; } public void setPet(Pet pet) { this.pet = pet; } public long getCount() { return count; } public void setCount(long count) { this.count = count; }}CatDogQueue
package pers.keafmd.accumulate.codeinterviewguide.catdogqueue;import java.util.LinkedList;import java.util.Queue;/** * Keafmd * * @ClassName: CatDogQueue * @Description: 猫狗队列 * @author: 牛哄哄的柯南 * @date: 2022-06-22 19:44 */public class CatDogQueue { private Queue<PetEnterQueue> dogQ; private Queue<PetEnterQueue> catQ; private long count; public CatDogQueue() { this.dogQ = new LinkedList<>(); this.catQ = new LinkedList<>(); this.count = 0; } //将Cat类或Dog类的实例放入队列中 public void add(Pet pet){ if(pet.getType().contains("dog")){ dogQ.add(new PetEnterQueue(pet,this.count++)); }else if(pet.getType().contains("cat")){ catQ.add(new PetEnterQueue(pet,this.count++)); }else{ throw new RuntimeException("错误,宠物类型既不是猫也不是狗"); } } //队列中所有的实例按照进队列的先后顺序依次弹出 public Pet pollAll(){ if(!dogQ.isEmpty()&&!catQ.isEmpty()){ if(dogQ.peek().getCount()<catQ.peek().getCount()){ return dogQ.poll().getPet(); }else{ return catQ.poll().getPet(); } }else if(!catQ.isEmpty()){ return catQ.poll().getPet(); }else if(!dogQ.isEmpty()){ return dogQ.poll().getPet(); }else{ throw new RuntimeException("错误,队列是空的!"); } } //队列中Dog类的实例按照进队列的先后顺序依次弹出 public Dog pollDog(){ if(!dogQ.isEmpty()){ return (Dog)dogQ.poll().getPet(); }else{ throw new RuntimeException("错误,队列是空的!"); } } //队列中Cat类的实例按照进队列的先后顺序依次弹出 public Cat pollCat(){ if(!catQ.isEmpty()){ return (Cat)catQ.poll().getPet(); }else{ throw new RuntimeException("错误,队列是空的!"); } } //检查队列中是否还有Dog或Cat的实例 public boolean isEmpty(){ return dogQ.isEmpty()&&catQ.isEmpty(); } //检查队列中是否有Dog类的实例 public boolean isDogEmpty(){ return dogQ.isEmpty(); } //检查队列中是否有Cat类的实例 public boolean isCatEmpty(){ return catQ.isEmpty(); }}测试类
package pers.keafmd.accumulate.codeinterviewguide.catdogqueue;/** * Keafmd * * @ClassName: QueueTest * @Description: 测试 * @author: 牛哄哄的柯南 * @date: 2022-06-22 19:04 */public class QueueTest { public static void main(String[] args) { CatDogQueue queue = new CatDogQueue(); Dog dog1 = new Dog("dog1"); Dog dog2 = new Dog("dog2"); Cat cat1 = new Cat("cat1"); Cat cat2 = new Cat("cat2"); Cat cat3 = new Cat("cat3"); queue.add(dog1); queue.add(cat1); queue.add(cat2); queue.add(cat3); queue.add(dog2); System.out.println(queue.pollAll().getType()); //dog1 System.out.println(queue.pollAll().getType()); //cat1 System.out.println(queue.pollDog().getType()); //dog2 System.out.println(queue.isDogEmpty()); //true System.out.println(queue.isCatEmpty()); //false System.out.println(queue.isEmpty()); //false System.out.println(queue.pollAll().getType()); //cat2 System.out.println(queue.pollDog().getType()); //报错 }}测试效果:
dog1cat1dog2truefalsefalsecat2Exception in thread "main" java.lang.RuntimeException: 错误,队列是空的! at pers.keafmd.accumulate.codeinterviewguide.catdogqueue.CatDogQueue.pollDog(CatDogQueue.java:58) at pers.keafmd.accumulate.codeinterviewguide.catdogqueue.QueueTest.main(QueueTest.java:32)Process finished with exit code 1搞定!
边栏推荐
- yii2连接websocket服务实现服务端主动推送消息给客户端
- How to open an account on the flush? Is it safe
- G : 最大流问题
- 你的代码会说话吗?(上)
- Vscode shortcut key
- MySQL从库Error:“You cannot ‘Alter‘ a log table...“
- 锐捷交换机配置ssh password登录命令[通俗易懂]
- Hubble database x a joint-stock commercial bank: upgrade the number management system of Guanzi, so that every RMB has an "ID card"
- 正则匹配数字,英文以及英文符号
- 单元测试 CI/CD
猜你喜欢

PHP crawls web pages for specific information

药物发现新方法,阿斯利康团队通过课程学习改进从头分子设计

How fragrant! The most complete list of common shortcut keys for pychar!

Pytorch Foundation

Stackoverflow 2022 database annual survey

Hubble database x a joint-stock commercial bank: upgrade the number management system of Guanzi, so that every RMB has an "ID card"

Inftnews | technology giants accelerate their march into Web3 and metauniverse

iNFTnews | 科技巨头加快进军Web3和元宇宙

Writing skills of resume

Design artificial intelligence products: technical possibility, user acceptability and commercial feasibility
随机推荐
Recognize the startup function and find the user entry
PCB understand Wang, are you? I am not
Elastic box auto wrap demo
如何备份mysql_史上最全的MYSQL备份方法
RK3399平台开发系列讲解(使用篇)Pinctrl子系统的介绍 - 视频介绍
How to solve the data inconsistency between redis and MySQL?
i++ , ++i
MySQL从库Error:“You cannot ‘Alter‘ a log table...“
PHP gets the number of digits and replaces it with the specified mantissa
Double buffer drawing
其他国产手机未能填补华为的空缺,苹果在高端手机市场已无对手
决策树预测红酒品质
3、项目的整体UI架构
895. longest ascending subsequence
Align content attribute in flex layout
Data analysis - promoter evolution analysis
如何设计数据可视化平台
MySQL多表联合查询
华泰证券开户怎么开 怎么办理开户最安全
Pytorch Foundation