双端队列问题——小R的随机播放顺序| 豆包MarsCode AI刷题

117 阅读2分钟

小R的随机播放顺序问题描述

小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。

例如,给定歌单 [5, 3, 2, 1, 4],真实的播放顺序是 [5, 2, 4, 1, 3]

保证歌曲中的id两两不同。

问题解析

小R的特殊随机播放规则分析,具体如下:

  1. 初始时,播放歌单中的第一首歌,并将这首歌从歌单中移除。
  2. 如果歌单中仍然有歌曲,则将当前的第一首歌(在移除上一首歌后的新第一首)移动到歌单的末尾。
  3. 重复上述步骤,直到歌单中的所有歌曲都被播放完毕。

这个规则很简单,可以通过以下步骤具体实现:

  • 使用一个队列(FIFO数据结构)来模拟歌单,因为队列的头部(front)总是当前的第一首歌。
  • 每次从队列中取出头部歌曲进行播放,并将其移除。
  • 如果队列不为空,则将新的头部歌曲(即原来的第二首歌)移动到队列的尾部。
  • 重复上述步骤直到队列为空。
  • 首先我们需要导入deque:deque(双端队列)提供了高效的从两端添加和删除元素的操作,非常适合这个问题。

代码

# 导入deque库
from collections import deque

def solution(n, a):
    # 使用deque来模拟队列
    queue = deque(a)
    result = []
    while queue:
        # 取出并播放队列头部的歌曲
        current_song = queue.popleft()
        result.append(current_song)

        # 如果队列不为空,将新的头部歌曲移动到尾部
        if queue:
            queue.append(queue.popleft())

    return result

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