问题描述
小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)来模拟这个过程,因为队列的先进先出(FIFO)特性非常适合这个场景。
-
算法步骤:
-
初始化一个空的结果列表。
-
将歌单中的歌曲依次加入队列。
-
循环直到队列为空:
- 从队列中取出第一首歌,加入结果列表。
- 如果队列不为空,将当前队列的第一首歌移到队列的末尾。
-
-
输出结果:最终的结果列表即为播放顺序。
from collections import deque
def solution(n: int, a: list) -> list:
q = deque(a)
res = []
while q:
res.append(q.popleft())
if q:
q.append(q.popleft())
return res
if __name__ == '__main__':
print(solution(n=5, a=[5, 3, 2, 1, 4]) == [5, 2, 4, 1, 3])
print(solution(n=4, a=[4, 1, 3, 2]) == [4, 3, 1, 2])
print(solution(n=6, a=[1, 2, 3, 4, 5, 6]) == [1, 3, 5, 2, 6, 4])