1. 程式人生 > 其它 >一種訊息接收並列印的結構設計

一種訊息接收並列印的結構設計

技術標籤:程式設計師程式碼面試指南

一種訊息接收並列印的結構設計

題目描述

已知一個訊息流會不斷地吐出整數 1 ∼ N 1 \sim N 1N,但不一定按照順序吐出。如果上次列印的數為i,那麼當i+1出現時,請列印i+1及其之後接收過的並且連續的所有數,直到 1 ∼ N 1 \sim N 1N全部接收並列印完,請設計這種接收並列印的結構

[要求]

訊息流最終會吐出全部的 1 ∼ N 1 \sim N 1N,當然最終也會列印完所有的 1 ∼ N 1\sim N 1N,要求接收和列印 1 ∼ N 1 \sim N 1N的整個過程,時間複雜度為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 1N105
保證輸入的是一個 1 ∼ N 1 \sim N 1N的排列


題解:

在讀入資訊流過程中,使用一個標記 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; }