📜  门|门模拟 2017 |第 46 题(1)

📅  最后修改于: 2023-12-03 15:28:49.247000             🧑  作者: Mango

门|门模拟 2017 | 第 46 题 介绍

这是一道程序设计题,涉及到模拟和数组等知识点。

题目描述

在一排电子门中,每个门要么是开门,要么是关门。现在随机选择了一些门并打开它们,问在打开的门中,有多少个连续的开门的序列。

输入格式
  • 第一行一个正整数 $n$,表示门的总个数 $(1 \leq n \leq 10^6)$;
  • 第二行 $n$ 个用空格隔开的整数,每个数为 $0$ 或 $1$,表示该门是否被打开,$0$ 表示门是关闭的,$1$表示门是打开的。。
输出格式
  • 一行一个整数,表示开门序列的数量。
样例
输入样例1
5
1 0 1 1 0
输出样例1
2
输入样例2
8
0 1 1 0 0 1 1 1
输出样例2
2
解题思路

我们可以用一个一维数组来存储门是否被打开。假设这个数组为doors

我们可以从左到右遍历数组,当doors[i]=1时,我们就开始计算当前的连续开门序列长度。

具体操作为:设当前连续开门序列长度为len,先判断当前门是否是第一个开门,如果是,则len=1;否则,如果上一个门也是开门,则继续累加len++;否则,上一个门是关闭的,len=1

我们每次都在上一步计算好连续开门序列长度后加入一个数组,最后再把所有的连续开门序列长度汇总在一起,就是答案。

具体实现代码如下:

n = int(input())
doors = list(map(int, input().split()))

lengths = []
cur_len = 0
for i in range(n):
    if doors[i] == 1:
        cur_len += 1
    else:
        if cur_len > 0:
            lengths.append(cur_len)
            cur_len = 0
if cur_len > 0:
    lengths.append(cur_len)

print(len(lengths))
时间复杂度

遍历一遍数组,时间复杂度为$O(n)$。

空间复杂度

需要一个额外的数组来保存连续开门序列长度,空间复杂度为$O(n)$。