左神算法:猫狗队列(通过给不同实例盖时间戳的方法实现)
本题来自左神《程序员面试代码指南》“猫狗队列”题目。
题目
宠物、狗和猫的类如下:
public class Pet {private String type;public Pet(String type){this.type = type;}public String getPetType(){return this.type;}public class Dog extends Pet{public Dog(){super("dog");}}public class Cat extends Pet{public Cat(){super("cat");}}
}
实现一种猫狗队列的结构,要求如下:
- 用户可以调用add() ,cat类或dog类的实例放入队列中
- 用户可以调用pollAll(),将队列中所有实例按照队列先后顺序依次弹出
- 用户可以调用pollDog()、pollCat(),将队列中dog类、cat类的实例按照进队列的先后顺序依次弹出
- 用户可以调用isEmpty(),检查队列中是否还有dog、cat的实例
- 用户可以调用isDogEmpty()、isCatEmpty(),分别检查队列中是否还有dog、cat的实例
解答
public static class PetEnterQueue {private Pet pet;private long count;public PetEnterQueue(Pet pet, long count) {this.pet = pet;this.count = count;}public Pet getPet() {return this.pet;}public long getCount() {return this.count;}public String getEnterPetType() {return this.pet.getPetType();}
}
package chapter_1_stackandqueue;import java.util.LinkedList;
import java.util.Queue;public class Problem_04_DogCatQueue {public static class Pet {private String type;public Pet(String type) {this.type = type;}public String getPetType() {return this.type;}}public static class Dog extends Pet {public Dog() {super("dog");}}public static class Cat extends Pet {public Cat() {super("cat");}}public static class PetEnterQueue {private Pet pet;private long count;public PetEnterQueue(Pet pet, long count) {this.pet = pet;this.count = count;}public Pet getPet() {return this.pet;}public long getCount() {return this.count;}public String getEnterPetType() {return this.pet.getPetType();}}public static class DogCatQueue {private Queue<PetEnterQueue> dogQ;private Queue<PetEnterQueue> catQ;private long count;public DogCatQueue() {this.dogQ = new LinkedList<PetEnterQueue>();this.catQ = new LinkedList<PetEnterQueue>();this.count = 0;}public void add(Pet pet) {if (pet.getPetType().equals("dog")) {this.dogQ.add(new PetEnterQueue(pet, this.count++));} else if (pet.getPetType().equals("cat")) {this.catQ.add(new PetEnterQueue(pet, this.count++));} else {throw new RuntimeException("err, not dog or cat");}}public Pet pollAll() {if (!this.dogQ.isEmpty() && !this.catQ.isEmpty()) {if (this.dogQ.peek().getCount() < this.catQ.peek().getCount()) {return this.dogQ.poll().getPet();} else {return this.catQ.poll().getPet();}} else if (!this.dogQ.isEmpty()) {return this.dogQ.poll().getPet();} else if (!this.catQ.isEmpty()) {return this.catQ.poll().getPet();} else {throw new RuntimeException("err, queue is empty!");}}public Dog pollDog() {if (!this.isDogQueueEmpty()) {return (Dog) this.dogQ.poll().getPet();} else {throw new RuntimeException("Dog queue is empty!");}}public Cat pollCat() {if (!this.isCatQueueEmpty()) {return (Cat) this.catQ.poll().getPet();} elsethrow new RuntimeException("Cat queue is empty!");}public boolean isEmpty() {return this.dogQ.isEmpty() && this.catQ.isEmpty();}public boolean isDogQueueEmpty() {return this.dogQ.isEmpty();}public boolean isCatQueueEmpty() {return this.catQ.isEmpty();}}public static void main(String[] args) {DogCatQueue test = new DogCatQueue();Pet dog1 = new Dog();Pet cat1 = new Cat();Pet dog2 = new Dog();Pet cat2 = new Cat();Pet dog3 = new Dog();Pet cat3 = new Cat();test.add(dog1);test.add(cat1);test.add(dog2);test.add(cat2);test.add(dog3);test.add(cat3);test.add(dog1);test.add(cat1);test.add(dog2);test.add(cat2);test.add(dog3);test.add(cat3);test.add(dog1);test.add(cat1);test.add(dog2);test.add(cat2);test.add(dog3);test.add(cat3);while (!test.isDogQueueEmpty()) {System.out.println(test.pollDog().getPetType());}while (!test.isEmpty()) {System.out.println(test.pollAll().getPetType());}}}
运行结果:
dog
dog
dog
dog
dog
dog
dog
dog
dog
cat
cat
cat
cat
cat
cat
cat
cat
cat
左神算法:猫狗队列(通过给不同实例盖时间戳的方法实现)相关推荐
- 数据结构与算法之猫狗队列
数据结构与算法之猫狗队列 目录 猫狗队列 1. 猫狗队列 描述 代码实现 import java.util.LinkedList; import java.util.Queue;public clas ...
- 算法练习day8——190326(猫狗队列、转圈打印矩阵、旋转正方形矩阵、反转单向双向链表、数N的加法组合)
1.猫狗队列 [题目] 宠物. 狗和猫的类如下: public class Pet {private String type;public Pet(String type) {this.type = ...
- 左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)
本题来自左神<程序员面试代码指南>"最大值减去最小值小于或等于num的子数组的数量"题目. 题目 给定数组 arr 和整数 num,共返回有多少个子数组满足如下情况: ...
- 左神算法:求最大子矩阵的大小(Java版)
本题来自左神<程序员面试代码指南>"求最大子矩阵的大小"题目. 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1 ...
- JAVA中在某游戏系统有猫狗猪_算法面试题之猫狗队列(java)
[题目]: 已知有宠物:狗.猫如下,实现一种猫狗队列的结构: /** * @ClassName Pet * @Description 宠物 * @Author Huarray * @Date 2019 ...
- 程序员代码面试指南第二版 4.猫狗队列
welcome to my blog 程序员代码面试指南第二版 4.猫狗队列 题目描述 题目描述 实现一种猫狗队列的结构,要求如下: 1. 用户可以调用 add 方法将 cat 或者 dog 放入队列 ...
- 左神算法:判断 t1 树中是否有与 t2 树拓扑结构完全相同的子树(Java版)
本题来自左神<程序员代码面试指南>"判断 t1 树中是否有与 t2 树拓扑结构完全相同的子树"题目. 题目 给定彼此独立的两棵树头节点分别为 t1 和 t2,判断 t1 ...
- 左神算法:二叉树的按层打印与ZigZag打印(Java版)
本题来自左神<程序员代码面试指南>"二叉树的按层打印与ZigZag打印"题目. 题目 给定一棵二叉树的头节点 head,分别实现 按层 和 ZigZag 打印 二叉树的 ...
- 左神算法:将搜索二叉树转换成双向链表(Java版)
本题来自左神<程序员代码面试指南>"将搜索二叉树转换成双向链表"题目. 题目 对二叉树的节点来说,有本身的值域,有指向左孩子节点和右孩子节点的两个指针:对双向链表的节点 ...
最新文章
- Zigbee如何在智能家居中成为领先的连接技术?
- jar打包 jar line too long 异常处理方法
- 瑞幸咖啡股价再大涨超36% 目前总市值约13.87亿美元
- 终于有人把项目搭建讲明白了!
- 详解Python函数式编程之map、reduce、filter
- python入门指南-Python 入门指南
- 无问西东,哪怕重头来过
- ImportError: cannot import name UnrewindableBodyError
- BlueViewer 地图加载分析(C#)
- JS数组 团里添加新成员(向数组增加一个新元素)只需使用下一个未用的索引,任何时刻可以不断向数组增加新元素。myarray[5]=88;...
- springmvc或者springboot 中实现跨域的5种方式
- 【三维路径规划】基于matlab A_star算法无人机三维路径规划【含Matlab源码 446期】
- Excel度分秒转度--公式大解析
- vs2015卸载指南
- 海外邮件收发阻碍多?【企业邮箱怎么申请】
- 常用API——Object、Objects、StringBuilder
- C++ Bayer图像格式,使用GDAL进行格式转换。
- 小程序与后台 api接口数据交互详解(微信报修小程序源码讲解七)
- 用C语言编写一个“简单”的程序答题系统
- 涂抹式水光针的使用方法你知道吗?
热门文章
- POJ - 2778 DNA Sequence(AC自动机+矩阵快速幂)
- (转)二维平面坐标系-最近点对模板
- 中石油训练赛 - 小说(最短路+二分)
- HDU - 2859 Phalanx(动态规划/哈希表)
- linux 提交git,linux下git使用记录1 git 提交
- 两个相邻盒子的边框怎么只显示一个_一篇文章带你快速理解盒子模型「经典案例」...
- Jenkins 设置镜像_docker+jenkins自动化部署
- 2021已去,2022未来
- Cannot add or update a child row: a foreign key constraint fails (`university`.`instructor`, CONSTRA
- 容器中构建镜像慢,在dockerfile中换源加速