一种消息接收并打印的结构设计

一种消息接收并打印的结构设计

题目描述

已知一个消息流会不断地吐出整数 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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种高级计算机编程语言,它提供了各种数据结构和操作,可以用来接收字典数据结构。 在C语言中,我们可以使用结构体来表示字典数据结构。结构体是一种用户自定义的数据类型,可以用来组织不同类型的数据。 例如,我们可以定义一个结构体来表示一个字典条目,这个结构体包含两个字段,一个用来表示键(key),一个用来表示值(value)。 ```c typedef struct { char key[100]; int value; } DictionaryEntry; ``` 在这个例子中,我们定义了一个结构体类型为DictionaryEntry,它包含一个char数组用来表示键,长度为100,还有一个int型的字段表示值。 接下来,我们可以使用数组来存储多个字典条目,并通过循环等方式来遍历和操作这些条目。 ```c #define MAX_ENTRIES 100 int main() { DictionaryEntry entries[MAX_ENTRIES]; int numEntries = 0; // 添加条目 strcpy(entries[numEntries].key, "apple"); entries[numEntries].value = 10; numEntries++; // 遍历条目 for (int i = 0; i < numEntries; i++) { printf("键:%s,值:%d\n", entries[i].key, entries[i].value); } return 0; } ``` 在这个例子中,我们创建了一个大小为MAX_ENTRIES的数组entries来存储字典条目。然后,我们可以通过赋值的方式向数组中添加条目,并使用循环来遍历和打印这些条目的键和值。 当然,这只是一种简单的示例,实际应用中可能需要更复杂的数据结构和算法来操作字典数据。但是,通过结构体和数组的组合,我们可以在C语言中接收和操作字典数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值