豆包 Mars Code刷题 | 小R的随机播放顺序

101 阅读2分钟

Hellow,大家好!我是Luintal。今天给大家分享的是我用豆包AI辅助刷题的心得,那么话不多说,我们直接进入主题。

一、问题重述

问题描述

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

二、代码实现

from collections import deque

def solution(n: int, a: list) -> list:
    # 初始化队列
    queue = deque(a)
    result = []
    
    # 模拟播放过程
    while queue:
        # 取出第一首歌
        first_song = queue.popleft()
        result.append(first_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])

三、解题思路

代码提示

  1. 初始化队列:将整个歌单作为初始队列。

  2. 模拟播放过程

    • 从队列中取出第一首歌(即队列的头部元素)。
    • 如果队列不为空,将当前队列的头部元素移到队列的尾部。
  3. 记录播放顺序:将每次取出的歌曲记录到一个结果列表中。

关键步骤解释

  • deque(a):将输入的歌单转换为一个双端队列。
  • queue.popleft():从队列的头部取出元素。
  • queue.append(next_song):将元素添加到队列的尾部。

四、总结

时间复杂度

  • 时间复杂度:O(n),其中 n 是歌单的长度。每个元素最多被访问两次(一次取出,一次移动)。
  • 空间复杂度:O(n),用于存储队列和结果列表。

数据结构选择

由于题目涉及到队列的操作(先进先出),我们选择使用 collections.deque 来实现队列。deque 提供了高效的 popleft() 和 append() 操作,非常适合模拟题目中的播放规则。


好了本次分享就到这里了。如果对我感兴趣,可以关注我的GitHub。 也可以加我的飞书一起交流。