问题描述
小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。
例如,给定歌单 [5, 3, 2, 1, 4]
,真实的播放顺序是 [5, 2, 4, 1, 3]
。
保证歌曲中的id
两两不同。
测试样例
样例1:
输入:
n = 5 ,a = [5, 3, 2, 1, 4]
输出:[5, 2, 4, 1, 3]
样例2:
输入:
n = 4 ,a = [4, 1, 3, 2]
输出:[4, 3, 1, 2]
样例3:
输入:
n = 6 ,a = [1, 2, 3, 4, 5, 6]
输出:[1, 3, 5, 2, 6, 4]
接下来我们分析一下这个题,这个问题描述了一个特殊的歌单播放规则,具体的操作是:
- 从歌单的第一首歌开始播放,播放后将其移除。
- 如果歌单中还有歌曲,当前播放的第一首歌会被移动到歌单的最后一位。
- 重复这个过程,直到歌单中没有歌曲为止。
要实现这个规则,可以通过模拟这个过程来解决。基本步骤如下:
解题思路
-
使用队列(Queue)来模拟这个过程,因为队列遵循先进先出的顺序,这符合题目中的“播放第一首歌,移到队尾”的要求。
-
对于每次操作:
- 取出队列的第一个元素,表示播放这首歌。
- 如果队列中还有其他歌曲,移除当前播放的歌曲后,将队列的第一个元素移到队尾。
-
继续这个过程,直到队列为空。
步骤
-
创建一个队列,队列的初始内容为给定的歌单。
-
进行循环操作,直到队列为空:
- 播放队列的第一首歌(即队列的第一个元素)。
- 如果队列中仍然有歌曲,将队列的第一个元素移到队尾。
-
记录播放的顺序并输出。
解析
- 队列的使用:我们利用队列的特性(先进先出)来模拟播放的过程,每次移除队头元素,播放后再把它移到队尾。
- 循环操作:每次从队列中移除并播放第一首歌,如果队列中还有歌曲,当前的第一首歌就会被移到队尾。直到队列为空,所有歌曲都播放完成。
时间复杂度
每个操作涉及队列的弹出和添加操作,时间复杂度是O(1)。由于最多进行n次操作,因此总体时间复杂度为O(n),其中n是歌单中的歌曲数量。
空间复杂度
由于我们使用了额外的队列存储歌曲列表,因此空间复杂度为O(n),n是歌单的长度。 通过这种方式,可以模拟并实现题目中给定的特殊播放规则。到这我们就可以写AC代码了: