小R的随机播放顺序
题目描述
小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。
例如,给定歌单
[5, 3, 2, 1, 4],真实的播放顺序是[5, 2, 4, 1, 3]。保证歌曲中的
id两两不同。
思路分析
- 这道题最为适用的就是使用queue队列方法
- 将歌单作为一个队列
- 进入循环,弹出一首曲子之后,再弹出一首曲子,再加入刚才弹出的曲子,就可以把当前第一首歌移到最后一首
- 中间一直判断队列是否为空,为空时退出循环
注意事项
- 关于queue的用法
- 使用queue=deque(list)来转化list为queue
- 队列内部函数popleft可以弹出队列最左侧的数据,返回值为所弹出的数据,可以用current_song或next_song来保存,方便加入结果数据或重新加入队列
解题步骤
1.用歌单来初始化这个队列,并创建一个result来保存播放顺序
queue = deque(a)
result = []
2.进入循环,循环结束条件为queue为空,弹出第一个值,并加入result中,如果queue仍不为空,则再弹出一个值,并将其重新加入队列
while queue:
# 播放当前第一首歌
current_song = queue.popleft()
result.append(current_song)
# 如果队列中还有歌曲,将当前第一首歌移到队列末尾
if queue:
next_song = queue.popleft()
queue.append(next_song)
3.最后返回播放顺序结果result
return result
完整代码
from collections import deque
def solution(n: int, a: list) -> list:
# 初始化队列
queue = deque(a)
result = []
# 模拟播放过程
while queue:
# 播放当前第一首歌
current_song = queue.popleft()
result.append(current_song)
# 如果队列中还有歌曲,将当前第一首歌移到队列末尾
if queue:
next_song = queue.popleft()
queue.append(next_song)
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])
总结时刻
对于这道题基本上没有什么其他更好的方法,从题目中“如果歌单中还有歌曲,则会将当前第一首歌移到最后一首”这句话可以确定选用队列作为容器最为适宜,之后只要根据题目意思进行创建队列和操作队列即可得到最终答案