小R的随机播放顺序问题描述
小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。
例如,给定歌单 [5, 3, 2, 1, 4],真实的播放顺序是 [5, 2, 4, 1, 3]。
保证歌曲中的id两两不同。
问题解析
小R的特殊随机播放规则分析,具体如下:
- 初始时,播放歌单中的第一首歌,并将这首歌从歌单中移除。
- 如果歌单中仍然有歌曲,则将当前的第一首歌(在移除上一首歌后的新第一首)移动到歌单的末尾。
- 重复上述步骤,直到歌单中的所有歌曲都被播放完毕。
这个规则很简单,可以通过以下步骤具体实现:
- 使用一个队列(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])