字节青训营之小R的随机播放顺序

52 阅读1分钟

问题描述

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

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

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

问题分析

抓住问题的重心首先是第一首歌先移除,然后把当前第一首歌移到最后,依次循环。这样就很像队列,先进先出的原则,后进放在队尾很符合题目的需求。

注意 :循环结束的条件是队列非空,同时移动到最后一首前提也是队列存在

def solution(n: int, a: list) -> list:
    # PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
    # write code here
    from collections import deque
    quene=deque(a)
    result=[]
    while quene :
        song=quene.popleft()
        result.append(song)
        if quene:
            last_song=quene.popleft()
            quene.append(last_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])

附加

python常用内建模块:collections中的deque模块

image.png

如果觉得有帮助,期待一个小红心。