题目:一种消息接收并打印的结构设计:已知一个消息流会不断地吐出整数 1 ~ N,但不一定按照顺序吐出。如果上次打印的数为i,那么当 i + 1 出现时,请打印 i + 1 及其之后接收过的并且连续的所有数,直到 1 ~ N 全部接收并打印完,请设计这种接收并打印的结构。
例如:
消息流吐出 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。
【要求】消息流最终会吐出全部的 1 ~ N,当然最终也会打印完所有的 1 ~ N,要求接收和打印 1 ~ N 的整个过程,时间复杂度为 O(N)。
分析:
结构:单向链表 + 两个 HashMap<Integer, Node> 【头表和尾表记录了所有连续区间的开头和结尾】
-
对于接收的每一个数,如果能和之前接收的数连续起来,就归入之前的数据区间中,如果不能就单独成为一个区间。每一个区间使用单链表结构实现。
-
例如,接收 2 的时候,根据 2 生成一个单链表节点,因为没有其他元素,所以它单独成一个区间[2];接收 1 的时候,根据 1 生成一个节点,然后发现之前的区间 [2] 可以和 1 连续起来,所以将该节点归