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

63 阅读2分钟

小R的随机播放顺序

题目描述

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

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

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

思路分析

  1. 这道题最为适用的就是使用queue队列方法
  2. 将歌单作为一个队列
  3. 进入循环,弹出一首曲子之后,再弹出一首曲子,再加入刚才弹出的曲子,就可以把当前第一首歌移到最后一首
  4. 中间一直判断队列是否为空,为空时退出循环

注意事项

  • 关于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])

总结时刻

对于这道题基本上没有什么其他更好的方法,从题目中“如果歌单中还有歌曲,则会将当前第一首歌移到最后一首”这句话可以确定选用队列作为容器最为适宜,之后只要根据题目意思进行创建队列和操作队列即可得到最终答案