小R的随机播放顺序 | 豆包MarsCode AI刷题

211 阅读1分钟

问题描述

小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]

解题思路

  1. 理解问题:我们需要模拟一个特殊的播放顺序,每次播放第一首歌,然后将其移除,如果还有歌曲,则将当前第一首歌移到最后一首。

  2. 数据结构选择:可以使用队列(Queue)来模拟这个过程,因为队列的先进先出(FIFO)特性非常适合这个场景。

  3. 算法步骤

    • 初始化一个空的结果列表。

    • 将歌单中的歌曲依次加入队列。

    • 循环直到队列为空:

      • 从队列中取出第一首歌,加入结果列表。
      • 如果队列不为空,将当前队列的第一首歌移到队列的末尾。
  4. 输出结果:最终的结果列表即为播放顺序。

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])