一種訊息接收並列印的結構設計
阿新 • • 發佈:2020-12-24
技術標籤:程式設計師程式碼面試指南
一種訊息接收並列印的結構設計
題目描述
已知一個訊息流會不斷地吐出整數 1 ∼ N 1 \sim N 1∼N,但不一定按照順序吐出。如果上次列印的數為i,那麼當i+1出現時,請列印i+1及其之後接收過的並且連續的所有數,直到 1 ∼ N 1 \sim N 1∼N全部接收並列印完,請設計這種接收並列印的結構
[要求]
訊息流最終會吐出全部的 1 ∼ N 1 \sim N 1∼N,當然最終也會列印完所有的 1 ∼ N 1\sim N 1∼N,要求接收和列印 1 ∼ N 1 \sim N 1∼N的整個過程,時間複雜度為O(N)$。
輸入描述:
第一行一個整數N。
接下來一行有N個整數。保證輸入是一個1到N的排列
輸出描述:
輸出N行,每行兩個數。
為了檢驗輸出的正確性,請在輸出當前列印的數字之後輸出此時最後一個加入的元素。
具體看輸入輸出樣例
示例1
輸入
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。
備註:
1
⩽
N
⩽
1
0
5
1 \leqslant N \leqslant 10^5
1⩽N⩽105
保證輸入的是一個
1
∼
N
1 \sim N
1∼N的排列
題解:
在讀入資訊流過程中,使用一個標記 now 記錄當前應該列印哪個數字, now 從1 開始,若資訊流中的讀入元素等於 now ,則可以列印。同時,使用一個雜湊表,記錄 now 之前哪些數字已經出現,這樣的話,在列印 now 之後,迴圈列印前面出現的 now+1 、now+2等元素。
程式碼:
#include <cstdio>
using namespace std;
const int N = 100001;
bool vis[N];
int main(void) {
int n, x;
scanf("%d", &n);
int now = 1;
for ( int i = 0; i < n; ++i ) {
scanf("%d", &x);
if ( x == now ) {
printf("%d %d\n", now, now );
int t = now + 1;
while ( t <= n && vis[t] ) printf("%d %d\n", t++, now );
now = t;
if ( now > n ) break;
} else vis[x] = true;
}
return 0;
}