题解-小K的随机播放顺序

124 阅读3分钟

题解:小K的随机播放顺序

问题描述

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

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

保证歌曲中的每一项都不同。

测试样例

  • 样例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])

解题思路

  1. 初始化播放顺序列表:首先,我们需要初始化一个空列表 play_order,用于存储最终的播放顺序。
  2. 模拟播放过程:使用一个 while 循环,直到歌曲列表 a 为空。在每次循环中:
    • 取出歌曲列表 a 中的第一首歌,并将其添加到 play_order 中。
    • 如果歌曲列表 a 中还有歌曲,则将当前第一首歌移到最后一首。
  3. 返回播放顺序:当歌曲列表 a 为空时,返回 play_order

代码实现

def solution(n: int, a: list) -> list:
    # 初始化播放顺序列表
    play_order = []
    
    # 模拟播放过程
    while a:
        # 取出第一首歌
        first_song = a.pop(0)
        play_order.append(first_song)
        
        # 如果歌曲中还有歌曲,则将当前第一首歌移到最后一首
        if a:
            a.append(a.pop(0))
    
    return play_order

# 测试样例
print(solution(5, [5, 3, 2, 1, 4]) == [5, 2, 4, 1, 3])
print(solution(4, [4, 1, 3, 2]) == [4, 3, 1, 2])
print(solution(6, [1, 2, 3, 4, 5, 6]) == [1, 3, 5, 2, 6, 4])

代码解析

  1. 初始化播放顺序列表

    • 创建一个空列表 play_order,用于存储最终的播放顺序。
    play_order = []
    
  2. 模拟播放过程

    • 使用 while 循环,直到歌曲列表 a 为空。
    • 在每次循环中,使用 a.pop(0) 取出歌曲列表 a 中的第一首歌,并将其添加到 play_order中。
    • 如果歌曲列表 a 中还有歌曲,则使用 a.append(a.pop(0)) 将当前第一首歌移到最后一首。
    while a:
        first_song = a.pop(0)
        play_order.append(first_song)
        if a:
            a.append(a.pop(0))
    
  3. 返回播放顺序

    • 当歌曲列表 a 为空时,返回 play_order
    return play_order
    

复杂度分析

  • 时间复杂度:O(n^2),其中 n 是歌曲列表的长度。每次循环中,a.pop(0) 和 a.append(a.pop(0))的时间复杂度均为 O(n),因此总的时间复杂度为 O(n^2)。
  • 空间复杂度:O(n),主要的空间开销在于存储播放顺序列表 play_order,其长度为 n。

总结

本题的核心在于模拟小K的随机播放规则,通过不断取出歌曲列表中的第一首歌并将其移到最后一首,直到歌曲列表为空。通过 Python 的列表操作,可以高效地完成这些任务。最终的代码简洁明了,易于理解和维护。