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])
三、解题思路
代码提示
-
初始化队列:将整个歌单作为初始队列。
-
模拟播放过程:
- 从队列中取出第一首歌(即队列的头部元素)。
- 如果队列不为空,将当前队列的头部元素移到队列的尾部。
-
记录播放顺序:将每次取出的歌曲记录到一个结果列表中。
关键步骤解释
deque(a):将输入的歌单转换为一个双端队列。queue.popleft():从队列的头部取出元素。queue.append(next_song):将元素添加到队列的尾部。
四、总结
时间复杂度
- 时间复杂度:O(n),其中 n 是歌单的长度。每个元素最多被访问两次(一次取出,一次移动)。
- 空间复杂度:O(n),用于存储队列和结果列表。
数据结构选择
由于题目涉及到队列的操作(先进先出),我们选择使用 collections.deque 来实现队列。deque 提供了高效的 popleft() 和 append() 操作,非常适合模拟题目中的播放规则。