本题重新定义队列出队的操作:队首出队的数字重新在队尾入队。 例:队列中有1 2 3三个数字,现要求队首出队,则1从队首出队,同时1从队尾入队,队列变成2 3 1。 入队的顺序为1,2,3,4......n,同时给一个二进制字符串,1代表出队操作,0代表入队操作。 输入格式: 在第一行有两个数字n,m(n<=100,n<m),其中n为入队的数字个数,m代表操作数 接下来m行,每行一个数字,1或者0,代表不同的操作 输出格式: 输出操作后队列的每个数字,数字间以空格分隔,最后一个数字后没有空格 输入样例: 5 8 0 0 1 0 1 0 1 0 输出样例: 3 2 4 1 5
时间: 2024-03-26 13:37:04 浏览: 51
第2章-实验3-模拟进程队列管理-入队与出队-yz1
题目描述
本题重新定义队列出队的操作:队首出队的数字重新在队尾入队。
例:队列中有1 2 3三个数字,现要求队首出队,则1从队首出队,同时1从队尾入队,队列变成2 3 1。
入队的顺序为1,2,3,4……n,同时给一个二进制字符串,1代表出队操作,0代表入队操作。
输入格式:
在第一行有两个数字n,m(n<=100,n<m),其中n为入队的数字个数,m代表操作数
接下来m行,每行一个数字,1或者0,代表不同的操作
输出格式:
输出操作后队列的每个数字,数字间以空格分隔,最后一个数字后没有空格
输入样例:
5 8
0
0
1
0
1
0
1
0
输出样例:
3 2 4 1 5
算法1
(模拟) $O(m*n)$
首先按题目要求进行模拟,考虑到每次操作后队首元素会重新入队,因此需要使用队列来模拟。同时,每次出队操作后,将队首元素重新入队,可以直接将队首元素出队然后再入队即可。
时间复杂度
每个元素最多被访问两次,因此时间复杂度为$O(m*n)$。
空间复杂度
需要开辟一个队列空间,因此空间复杂度为$O(n)$。
C++ 代码
算法2
(优化) $O(m)$
由于每次出队操作后,队首元素重新入队,因此我们可以不必真正地将队首元素出队再入队,而是记录下队首元素,然后让队首指针向右移动一个位置。当队首指针移动到队列末尾时,将其置为0,类似于循环数组的实现。
时间复杂度
每个元素最多被访问两次,因此时间复杂度为$O(m)$。
空间复杂度
只需要开辟一个数组空间,因此空间复杂度为$O(n)$。
C++ 代码
阅读全文