題目:一種訊息接收並列印的結構設計:已知乙個訊息流會不斷地吐出整數 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【頭表和尾表記錄了所有連續區間的開頭和結尾】
public class receiveandprintorderline
}private hashmapheadmap = new hashmap<>();
private hashmaptailmap = new hashmap<>();
private int lastprint = 0;
public void receive(int num, string content)
// 將訊息標號和內容構建成煉表節點的形式
node current = new node(num, content);
headmap.put(num, current);
tailmap.put(num, current);
// 這個數前面有乙個鍊錶,它要成為新的尾部,它也不再是頭了
if(tailmap.containskey(num - 1))
// 這個數後面有乙個鍊錶,它將成為新的頭,它也不再是尾了
if(headmap.containskey(num + 1))
// 判斷列印時機:現在的頭結點是否是lastprint+1
if(headmap.containskey(lastprint + 1))
}public void print()
tailmap.remove(--lastprint);
system.out.println();
}}
CD 79 一種訊息接收並列印的結構設計
題目描述 已知乙個訊息流會不斷地吐出整數1 sim n1 n,但不一定按照順序吐出。如果上次列印的數為i,那麼當i 1出現時,請列印i 1及其之後接收過的並且連續的所有數,直到1 sim n1 n全部接收並列印完,請設計這種接收並列印的結構 要求 訊息流最終會吐出全部的1 sim n1 n,當然最終...
一種快速的字串匹配演算法
快速字串查詢函式 目前比較流行的字串有kmp與bm演算法,實際上kmp演算法在使用的時候比strchr快不了多少,而bm演算法也 大約只有kmp演算法的3 5倍。這裡介紹乙個快速字串查詢函式。舉乙個例子 hello,world 中查詢 word 子串,可以先把兩個字串按照首位元組對好 hello,w...
字串permute演算法的一種實現
permute演算法是求序列的全排列,對於字串來說,就是將組成該字串的所有字元按各種方式排列一下。可以通過遞迴實現該演算法。遞迴的基準情形是 當字串的長度小於等於1時,其全排列就是字串自身,直接輸出。如果字串長度大於1,則遍歷字串中的每個字元,以該字元作為目的串的起始字元,再對源串中的其餘字元求全排...