79 一种消息接收并打印的结构设计
Table of Contents

ac

输出N行,每行两个数。

为了检验输出的正确性,请在输出当前打印的数字之后输出此时最后一个加入的元素。

具体看输入输出样例
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


// 79题
class MessageBox{

    public Map<Integer, Node> headMap;
    public Map<Integer, Node> tailMap;
    public int lastPrintVal;

    public MessageBox() {
        headMap = new HashMap<>();
        tailMap = new HashMap<>();
        lastPrintVal = 0;
    }

    public void receiveMsg(int num){
        if(num < 1){
            return;
        }
        Node curNode = new Node(num);
        headMap.put(num, curNode);
        tailMap.put(num, curNode);
        // 判断区间是否可以合并
        if(tailMap.containsKey(num-1)){ // 首尾有,连接两个区间
            Node tailNode = tailMap.get(num - 1);
            tailNode.next = curNode;
            // 删除老的区间节点
            tailMap.remove(num - 1);
            headMap.remove(num);
        }
        // 经过上一步后肯定有tailMap是 num 的节点的
        // 接着判断是否能连接某个头部是 num + 1的节点
        if(headMap.containsKey(num + 1)){ //
            Node tailNode = tailMap.get(num);
            tailNode.next = headMap.get(num + 1);
            // 删除老的节点
            tailMap.remove(num);
            headMap.remove(num + 1);

        }
        // 最后判断打印与否
        if(headMap.containsKey(lastPrintVal + 1)){
            printMsg(num);
        }
    }

    private void printMsg(){
        Node headNode = headMap.get(lastPrintVal + 1);
        lastPrintVal ++;
        headMap.remove(headNode.val);
        while (headNode != null){
            System.out.print(headNode.val + " ");
            headNode = headNode.next;
            lastPrintVal ++;
        }
        tailMap.remove(lastPrintVal - 1);
        lastPrintVal --;
        System.out.println();
    }

    private void printMsg(int num){
        Node headNode = headMap.get(lastPrintVal + 1);
        lastPrintVal ++;
        headMap.remove(headNode.val);
        while (headNode != null){
            System.out.println(headNode.val + " " + num);
            headNode = headNode.next;
            lastPrintVal ++;
        }
        tailMap.remove(lastPrintVal - 1);
        lastPrintVal --;
    }

    class Node{
        public int val;
        public Node next;

        public Node(int val, Node next) {
            this.val = val;
            this.next = next;
        }
        public Node(int val) {
            this.val = val;
            this.next = null;
        }
    }
}

public class Main {
    public static Scanner sc = new Scanner(System.in);

    public static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws Exception {
        int n = sc.nextInt();
        MessageBox messageBox = new MessageBox();
        for(int i=0;i<n;i++){
            int val = sc.nextInt();
            messageBox.receiveMsg(val);
        }

    }

}
/*
9
2 1 4 5 7 3 9 8 6

1 1
2 1
3 3
4 3
5 3
6 6
7 6
8 6
9 6
消息流吐出2,一种结构接收而不打印2,因为1还没出现。
消息流吐出1,一种结构接收1,并且打印:1, 2。
消息流吐出4,一种结构接收而不打印4,因为3还没出现。
消息流吐出5,一种结构接收而不打印5,因为3还没出现。
消息流吐出7,一种结构接收而不打印7,因为3还没出现。
消息流吐出3,一种结构接收3,并且打印:3, 4, 5。
消息流吐出9,一种结构接收而不打印9,因为6还没出现。
消息流吐出8,一种结构接收而不打印8,因为6还没出现。
消息流吐出6,一种结构接收6,并且打印:6, 7, 8, 9。
 */