welcome to my blog

程序员代码面试指南第二版 4.猫狗队列

题目描述

题目描述
实现一种猫狗队列的结构,要求如下:
1. 用户可以调用 add 方法将 cat 或者 dog 放入队列中
2. 用户可以调用 pollAll 方法将队列中的 cat 和 dog 按照进队列的先后顺序依次弹出
3. 用户可以调用 pollDog 方法将队列中的 dog 按照进队列的先后顺序依次弹出
4. 用户可以调用 pollCat 方法将队列中的 cat 按照进队列的先后顺序依次弹出
5. 用户可以调用 isEmpty 方法检查队列中是否还有 dog 或 cat
6. 用户可以调用 isDogEmpty 方法检查队列中是否还有 dog
7. 用户可以调用 isCatEmpty 方法检查队列中是否还有 cat输入描述:
第一行输入一个整数 n 表示 用户的操作总次数。以下 n行 每行表示用户的一次操作每行的第一个参数为一个字符串 s,若 s = “add”, 则后面接着有 “cat x”(表示猫)或者“dog x”(表示狗),其中的 x 表示猫狗的编号。输出描述:
对于每个操作:若为 “add”,则不需要输出。以下仅列举几个代表操作,其它类似的操作输出同理。若为 “pollAll”,则将队列中的 cat 和 dog 按照进队列的先后顺序依次弹出。(FIFO),格式见样例。若为 "isEmpty",则检查队列中是否还有 dog 或 cat, 为空则输出 “yes”, 否则输出 “no”。示例1输入
11
add cat 1
add dog 2
pollAll
isEmpty
add cat 5
isDogEmpty
pollCat
add dog 10
add cat 199
pollDog
pollAll输出
cat 1
dog 2
yes
yes
cat 5
dog 10
cat 199

第一次做, 看起来BufferedReader比Scanner更快, 用BufferedReader就通过了所有的案例

  • 不改动原来的类Pet,Cat,Dog
  • 将原来的类封装成一个新的类PetEnterQueue, 这个类可以标记Pet进队的次序
  • 将这个新的类PetEnterQueue作为操作猫狗队列的类DogCatQueue的泛型, 每次调用DogCatQueue的实例时,可以把count参数传给刚add进队列的PetEnterQueue
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;public class Main{public static void main(String[] args) throws IOException{//        Scanner sc = new Scanner(System.in);BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        int n = Integer.valueOf(sc.nextLine());int n = Integer.valueOf(br.readLine());DogCatQueue q = new DogCatQueue();for(int i=0; i<n; i++){//            String[] curr = sc.nextLine().split(" ");String[] curr = br.readLine().split(" ");if(curr[0].startsWith("add")){Pet pet = new Pet(curr[1], curr[2]);q.add(pet);}else if(curr[0].startsWith("pollAll")){while(!q.isEmpty()){PetEnterQueue p = q.pollAll();System.out.println(p.getPet().getPetType() + " " + p.getPet().getId());}}else if(curr[0].startsWith("pollCat")){while(!q.isCatQueueEmpty()){PetEnterQueue p = q.pollCat();System.out.println(p.getPet().getPetType() + " "+ p.getPet().getId());}}else if(curr[0].startsWith("pollDog")){while(!q.isDogQueueEmpty()){PetEnterQueue p = q.pollDog();System.out.println(p.getPet().getPetType() + " " + p.getPet().getId());}}else if(curr[0].startsWith("isEmpty")){curr[0] = q.isEmpty() ? "yes" : "no";System.out.println(curr[0]);}else if(curr[0].startsWith("isDogEmpty")){curr[0] = q.isDogQueueEmpty() ? "yes" : "no";System.out.println(curr[0]);}else if(curr[0].startsWith("isCatEmpty")){curr[0] = q.isCatQueueEmpty() ? "yes" : "no";System.out.println(curr[0]);}}}public static class DogCatQueue{private Queue<PetEnterQueue> dogQ;private Queue<PetEnterQueue> catQ;private long count;public  DogCatQueue(){this.dogQ = new LinkedList<>();this.catQ = new LinkedList<>();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("输入有误");}}public PetEnterQueue pollAll(){if(dogQ.isEmpty() && catQ.isEmpty())throw new RuntimeException("队列为空!");else if(dogQ.isEmpty())return catQ.poll();else if(catQ.isEmpty())return dogQ.poll();else{if(dogQ.peek().getCount() < catQ.peek().getCount())return dogQ.poll();elsereturn catQ.poll();}}public PetEnterQueue pollDog(){if(dogQ.isEmpty())throw new RuntimeException("狗队列为空!");return dogQ.poll();}public PetEnterQueue pollCat(){if(catQ.isEmpty())throw new RuntimeException("猫队列为空!");return catQ.poll();}public boolean isEmpty(){return dogQ.isEmpty() && catQ.isEmpty();}public boolean isDogQueueEmpty(){return dogQ.isEmpty();}public boolean isCatQueueEmpty(){return catQ.isEmpty();}}//定义一个新的类, 实现将不同的实例盖上时间戳的方法, 但是有没有改变用户本身的类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 Pet{private String type;private String id;public Pet(String type, String id){this.type = type;this.id = id;}public String getPetType(){return this.type;}public String getId(){return this.id;}}public static class Dog extends Pet{public Dog(String id){super("dog", id);}}public static class Cat extends Pet{public Cat(String id){super("cat", id);}}
}

第一次做, 只能通过75%

/*
不改动原来的类
将原来的类封装成一个新的类
将这个新的类作为队列的泛型, 每次调用队列所表示的类时, 可以把count参数传给刚add进队列的新的类
*/
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = Integer.valueOf(sc.nextLine());DogCatQueue q = new DogCatQueue();for(int i=0; i<n; i++){String curr = sc.nextLine();if(curr.startsWith("add")){Pet pet = new Pet(curr.split(" ")[1]);q.add(pet, Integer.valueOf(curr.split(" ")[2]));}else if(curr.startsWith("pollAll")){while(!q.isEmpty()){PetEnterQueue p = q.pollAll();System.out.println(p.getPet().getPetType() + " " + p.getNumber());}}else if(curr.startsWith("pollCat")){while(!q.isCatQueueEmpty()){PetEnterQueue p = q.pollCat();System.out.println(p.getPet().getPetType() + " "+ p.getNumber());}}else if(curr.startsWith("pollDog")){while(!q.isDogQueueEmpty()){PetEnterQueue p = q.pollDog();System.out.println(p.getPet().getPetType() + " " + p.getNumber());}}else if(curr.startsWith("isEmpty")){curr = q.isEmpty() ? "yes" : "no";System.out.println(curr);}else if(curr.startsWith("isDogEmpty")){curr = q.isDogQueueEmpty() ? "yes" : "no";System.out.println(curr);}else if(curr.startsWith("isCatEmpty")){curr = q.isCatQueueEmpty() ? "yes" : "no";System.out.println(curr);}}}public static class DogCatQueue{private Queue<PetEnterQueue> dogQ;private Queue<PetEnterQueue> catQ;private long count;public  DogCatQueue(){this.dogQ = new LinkedList<>();this.catQ = new LinkedList<>();this.count = 0;}public void add(Pet pet, int number){if(pet.getPetType().equals("dog")){this.dogQ.add(new PetEnterQueue(pet, ++this.count, number));}else if(pet.getPetType().equals("cat")){this.catQ.add(new PetEnterQueue(pet, ++this.count, number));}else{throw new RuntimeException("输入有误");}}public PetEnterQueue pollAll(){if(dogQ.isEmpty() && catQ.isEmpty())throw new RuntimeException("队列为空!");else if(dogQ.isEmpty())return catQ.poll();else if(catQ.isEmpty())return dogQ.poll();else{if(dogQ.peek().getCount() < catQ.peek().getCount())return dogQ.poll();elsereturn catQ.poll();}}public PetEnterQueue pollDog(){if(dogQ.isEmpty())throw new RuntimeException("狗队列为空!");return dogQ.poll();}public PetEnterQueue pollCat(){if(catQ.isEmpty())throw new RuntimeException("猫队列为空!");return catQ.poll();}public boolean isEmpty(){return dogQ.isEmpty() && catQ.isEmpty();}public boolean isDogQueueEmpty(){return dogQ.isEmpty();}public boolean isCatQueueEmpty(){return catQ.isEmpty();}}//定义一个新的类, 实现将不同的实例盖上时间戳的方法, 但是有没有改变用户本身的类public static class PetEnterQueue{private Pet pet;private long count;private int number;public PetEnterQueue(Pet pet, long count, int number){this.pet = pet;this.count = count;this.number = number;}public Pet getPet(){return this.pet;}public long getCount(){return this.count;}public int getNumber(){return this.number;}public String getEnterPetType(){return this.pet.getPetType();}}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");}}
}

程序员代码面试指南第二版 4.猫狗队列相关推荐

  1. 《程序员代码面试指南第二版》Python实现(个人读书笔记)

    说明 最近在读左神的书---<程序员代码面试指南-IT名企算法与数据结构题目最优解(第二版)>以及看了一些左神的基础.进阶.高频等视频课程,为了记录自己的学习成果,并且方便以后查看,将自己 ...

  2. 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈

    题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...

  3. 算法大神左程云耗尽5年心血分享程序员代码面试指南第2版文档

    前言 学习是一种基础性的能力.然而,"吾生也有涯,而知也无涯.",如果学习不注意方法,则会"以有涯随无涯,殆矣". 学习就像吃饭睡觉一样,是人的一种本能,人人都 ...

  4. 《程序员代码面试指南》第二章 链表问题 构造链表和节点的实体

    准备一些链表和节点的实体,方便后面使用 java代码 /*** @Description:构造一个链表实体,方便后续构造链表* @Author: lizhouwei* @CreateDate: 201 ...

  5. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /*** @Description:在单链表和双链表中删除倒数第K个节点* @Author: lizhouwei* @CreateDate: ...

  6. 《程序员代码面试指南》第二章 链表问题 搜索二叉树转换为双向链表

    样例 树的中序遍历:1 2 3 4 5 6 7 ,转换后双向链表的遍历:1 2 3 4 5 6 7 java代码 /*** @Description:搜索二叉树转换为双向链表* @Author: li ...

  7. 《程序员代码面试指南》第二章 链表问题 反转部分单向链表

    题目 给一个单向链表和开始和结束的位置,将这两位置区间链表进行反转 java代码 /*** @Description:反转部分单向链表* @Author: lizhouwei* @CreateDate ...

  8. 《程序员代码面试指南》第二章 链表问题 删除无序链表中值重复的链表

    样例 998 998 998 999 999 999 1000 1000 1000 删除后为998 999 1000 java代码 /*** @Description:删除无序链表中值重复的链表* @ ...

  9. 《程序员代码面试指南》第五章 字符串问题 拼接所有字符串产生字典顺序最小的大写字符串...

    题目 拼接所有字符串产生字典顺序最小的大写字符串 java代码 努力中.... 转载于:https://www.cnblogs.com/lizhouwei/p/8955158.html

最新文章

  1. linux获取fifo中的数据数量,Linux select()和多个套接字的FIFO排序?
  2. 数字营销迎来黄金期 TalkingData推出“营销云”平台
  3. 年度总结 | 2020 Flink 学习路线总结
  4. k8s高可用集群多个主节点_k8s-高可用集群实现(keepalived)
  5. 接口测试如何在post请求中传递文件
  6. python memory-management
  7. C++练习题(数组1)
  8. redis 入门总结
  9. c语言课程建设与改革,C语言程序设计课程教学改革的研究与实践
  10. 8.NLTK之分析句子结构
  11. U盘安装CentOS系统
  12. 日期格式化中的大小写区别
  13. 网站banner怎样设计才能提高吸引力?
  14. CG-62 压电式雨量传感器 什么是压电式雨量传感器,压电雨量传感器和翻斗式雨量传感器优势对比
  15. 英语音标,元音汇总(0基础学英语!必备!)
  16. STM32F103 内部温度传感器实验
  17. 安卓app之按键美化
  18. C语言整数转字符串-递归算法
  19. 11.15-11.21【大学生Python学习】社区总结+优秀社区成员点名表扬技术书籍和CSDN定制背包奖励~
  20. IT行业是否属于成长性行业?

热门文章

  1. c#线程-线程间发消息-线程给窗体传值
  2. error::make_unique is not a member of ‘std’
  3. android原生app转成web,转战WebApp: 最适合Android开发者的WebApp框架
  4. Linux系统存储之LVM
  5. PHP 操作redis 详细讲解
  6. python游戏编程培训
  7. 程序员眼中的编程语言和操作系统
  8. Linux下的压缩解压缩工具(转载)
  9. 关于睡眠检测自定义VIEW
  10. Python 每日一记217根据词频生成词云图