题解 | #CD100 猫狗队列#

猫狗队列

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

双队列解法

  • 运行时间:2054ms,超过52.30% 用Java提交的代码
  • 占用内存:45940KB,超过96.82%用Java提交的代码

第一遍做,代码思想就是对的,一直不通过,是因为每次结果都立即输出,会因多次IO操作而超时。 改进措施可以先用StringBuilder拼接输出,最后再一次性输出结果,缺点是占用内存较多。

import java.util.*;
import java.io.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    Deque<Node> dogs = new LinkedList<>();
    Deque<Node> cats = new LinkedList<>();
    int index = 0;
    public static void main(String[] args) throws IOException {
        Main mn = new Main();
        BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
        int row = Integer.parseInt(sc.readLine());
        for (int i = 0; i < row; i++) {
            String s = sc.readLine();
            switch (s) {
                case "pollAll":
                    mn.pollAll();
                    break;
                case "pollDog":
                    mn.pollDog();
                    break;
                case "pollCat":
                    mn.pollCat();
                    break;
                case "isEmpty":
                    mn.isEmpty();
                    break;
                case "isDogEmpty":
                    mn.isDogEmpty();
                    break;
                case "isCatEmpty":
                    mn.isCatEmpty();
                    break;
                default:
                    String[] ss = s.split(" ");
                    String pet = ss[1];
                    int num = Integer.valueOf(ss[2]);
                    mn.add(pet, num);
                    break;

            }
        }
    }
    private void isEmpty() {
        if (cats.isEmpty() && dogs.isEmpty()) {
            System.out.println("yes");
        } else {
            System.out.println("no");
        }
    }
    private void isDogEmpty() {
        if (dogs.isEmpty())  {
            System.out.println("yes");
        } else {
            System.out.println("no");
        }
    }
    private void isCatEmpty() {
        if (cats.isEmpty())  {
            System.out.println("yes");
        } else {
            System.out.println("no");
        }
    }
    private void pollAll() {
        StringBuilder sb = new StringBuilder();
        while (!dogs.isEmpty() && !cats.isEmpty()) {
            int didx = dogs.peek().idx;
            int cidx = cats.peek().idx;
            if (didx < cidx) {
                Node node = dogs.pop();
                sb.append("dog ");
                sb.append(node.val);
                sb.append("\n");

//                 System.out.println("dog " + node.val);
            } else {
                Node node = cats.pop();
                sb.append("cat ");
                sb.append(node.val);
                sb.append("\n");
//                 System.out.println("cat " + node.val);
            }
        }
        while (!dogs.isEmpty()) {
            Node node = dogs.pop();
            sb.append("dog ");
            sb.append(node.val);
            sb.append("\n");
//             System.out.println("dog " + node.val);
        }

        while (!cats.isEmpty()) {
            Node node = cats.pop();
            sb.append("cat ");
            sb.append(node.val);
            sb.append("\n");
//             System.out.println("cat " + node.val);
        }
        System.out.print(sb.toString());
    }

    private void pollDog() {
        StringBuilder sb = new StringBuilder();
        while (!dogs.isEmpty()) {
            Node node = dogs.pop();
            sb.append("dog ");
            sb.append(node.val);
            sb.append("\n");
        }
        System.out.print(sb.toString());

    }
    private void pollCat() {
        StringBuilder sb = new StringBuilder();
        while (!cats.isEmpty()) {
            Node node = cats.pop();
            sb.append("cat ");
            sb.append(node.val);
            sb.append("\n");
        }
        System.out.print(sb.toString());
    }
    private void add(String type, int num) {
        Node node = new Node(index++, num);
        if (type.equals("cat")) {
            cats.add(node);
        } else {
            dogs.add(node);
        }
    }
}

class Node {
    Integer idx;
    Integer val;

    Node() {}
    Node(int idx, int val) {
        this.idx = idx;
        this.val = val;
    }

}

单队列解法

把 Cat 和 Dog 保存在同一个队列中,Node 多增加了 catdog 指针。算下来,在时间和内存上都比双队列要提升一点点,但是提升不多,代码倒是复杂许多,不是非常好的做法

  • 运行时间:1804ms,超过56.18% 用Java提交的代码
  • 占用内存:32312KB, 超过97.53%用Java提交的代码
import java.util.*;
import java.io.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    Node head = new Node();
    Node tail = head;
    Node tdog = head;
    Node tcat = head;
    public static void main(String[] args) throws IOException {
        Main mn = new Main();
        BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
        int row = Integer.parseInt(sc.readLine());
        for (int i = 0; i < row; i++) {
            String s = sc.readLine();
            switch (s) {
                case "pollAll":
                    mn.pollAll();
                    break;
                case "pollDog":
                    mn.pollDog();
                    break;
                case "pollCat":
                    mn.pollCat();
                    break;
                case "isEmpty":
                    mn.isEmpty();
                    break;
                case "isDogEmpty":
                    mn.isDogEmpty();
                    break;
                case "isCatEmpty":
                    mn.isCatEmpty();
                    break;
                default:
                    String[] ss = s.split(" ");
                    String pet = ss[1];
                    int num = Integer.valueOf(ss[2]);
                    mn.add(pet, num);
                    break;

            }
        }
    }
    private void isEmpty() {
        if (tail == head) {
            System.out.println("yes");
        } else {
            System.out.println("no");
        }
    }
    private void isDogEmpty() {
        if (tdog == head)  {
            System.out.println("yes");
        } else {
            System.out.println("no");
        }
    }
    private void isCatEmpty() {
        if (tcat == head)  {
            System.out.println("yes");
        } else {
            System.out.println("no");
        }
    }
    private void pollAll() {
        StringBuilder sb = new StringBuilder();
        Node p = head.next;
        while(p != null) {
            if(p.type == 0) {
                sb.append("cat ");
            }else {
                sb.append("dog ");
            }
            sb.append(p.val);
            sb.append("\n");
            p = p.next;
        }
        head.next = null;
        head.dog = null;
        head.cat = null;
            
        tail = head;
        tcat = head;
        tdog = head;
        System.out.print(sb.toString());
    }

    private void pollDog() {
        StringBuilder sb = new StringBuilder();
        Node p = head.dog;
        while (p != null) {
            sb.append("dog ");
            sb.append(p.val);
            sb.append("\n");
            p.prev.next = p.next;
            if (p.next != null) {
                p.next.prev = p.prev;
            }
            p = p.dog;
        }
        head.dog = null;
        tdog = head;
        if(tail.type == 1) tail = tcat;
        System.out.print(sb.toString());

    }
    private void pollCat() {
        StringBuilder sb = new StringBuilder();
        Node p = head.cat;
        while (p != null) {
            sb.append("cat ");
            sb.append(p.val);
            sb.append("\n");
            p.prev.next = p.next;
            if (p.next != null) {
                p.next.prev = p.prev;
            }
            p = p.cat;
        }
        head.cat = null;
        tcat = head;
        if(tail.type == 0) tail = tdog;
        System.out.print(sb.toString());

    }
    private void add(String type, int num) {
        Node node = new Node(num);
        node.prev = tail;
        tail.next = node;
        tail = node;
        if (type.equals("cat")) {
            node.type = 0;
            tcat.cat = node;
            tcat = node;
        } else {
            node.type = 1;
            tdog.dog = node;
            tdog = node;
        }
    }
}

class Node {
    Node next;
    Node cat;
    Node dog;
    Node prev;
    Integer val;
    int type;

    Node() {}
    Node(int val) {
        this.val = val;
    }

}
全部评论

相关推荐

03-26 08:58
已编辑
门头沟学院 Java
ttl:&nbsp;3.19一面晚上过3.20二面3.23oc3.25offerbase:末9有一段中小厂实习一面面经:(总体时长一个小时二十分钟左右没什么八股,主要都是问项目和场景题1.实习(问了有四十分钟,感觉面试官很看重实习这一块,一直在拷打,问到后面我都要疯了,好在准备得比较充分1️⃣用的是什么中间件,有参与技术选型吗,实习的项目里为什么选这个RabbitMQ而不是kafka,为什么不用RocketMQ,为什么放弃异步,自己的项目里面使用的是kafka,那你觉得项目和实习的中间件选型有差异的原因是什么,他们之间的区别在哪里,底层的原因知道吗(高柱到这里已经快疯了,但是硬着头皮答完了,主要是从一致性吞吐量和框架的契合度答,面试官说答得挺好的,应该是没什么问题,这一块就问了快半个小时,到这里我已经快疯了2️⃣项目怎么对接上下游3️⃣介绍项目的难点重点4️⃣微服务(高柱实习是单体项目没涉及这一块5️⃣Redis的使用2.项目:1️⃣智能客服是怎么应用在项目里的(langchain4j➕rag➕functioncalling)2️⃣RAG了解多少3️⃣文本向量化的难点是什么,了解哪些大模型的知识(我一点不懂,纯瞎扯,但貌似扯对了4️⃣对ai的态度是什么,aicoding相关5️⃣怎么保证多节点下Caffeine缓存里面数据都是一致的(答的是短ttl,面试官不是很满意,但是我确实不太懂这个怎么保证,后来查了还是不懂怎么保证6️⃣Redis的使用,和你的实习项目的使用有区别吗,还有一些引申问题3.八股(含量不高,就是走个过场1️⃣进程的内存布局2️⃣Redis三剑客3️⃣微服务相关知识(高柱已经忘得差不多了…勉强答上来4️⃣JVM5️⃣线程状态6️⃣线程安全,在你的实习项目里怎么保证线程安全的(又绕回来了4.智商题找异常球5.手撕:1️⃣五道sql,不难2️⃣力扣不重叠的滑动窗口数组,贪心➕双指针秒了强度拉满了这个一面,高柱到后面人都是傻的二面面经:(就半个小时实习拷打,简历上写了几点就问了几点,问完就结束了,无手撕
查看19道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务