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

55 阅读4分钟

先上代码

    ans = []
    while a:
        ans.append(a.pop(0))
        if a:
            temp = a.pop(0)
            a.append(temp)
    return ans
    pass

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

此段代码乃为解决一问题之算法也。其核心功能乃依序将列表 a 中之元素,按特定规则取出,形成新的列表 ans。吾辈将逐一解构其逻辑,详加解析。

一、问题之提出

首先,函数 solution(n: int, a: list) 的功能目标为:对给定的列表 a 按照一定规则进行处理,最终返回一个新的列表 ans。具体规则为:

  1. 每次从列表 a 之中取出第一个元素并放入 ans
  2. 然后若列表 a 尚有剩余元素,则将其余第一个元素移至列表末尾。

此规则反复执行,直至列表 a 中所有元素被取出,最终形成新的列表 ans

二、代码之解构

吾辈将代码逐行详解,以便更好理解其运作方式。

1. 函数定义及参数

python
def solution(n: int, a: list) -> list:

此行定义了名为 solution 之函数,接收两参数:n 为列表 a 之长度(然则此处未使用,可能为冗余),a 为待处理之列表。

2. 初始化答案列表

python
    ans = []

此行创建空列表 ans,用于存储最终结果。

3. 主循环:遍历 a

python
    while a:

此处使用 while a 循环,表示只要列表 a 非空,则继续执行循环体内的代码。此循环每次执行时,列表 a 将经历一次元素的取出与重新排列,直至所有元素均已处理。

4. 从 a 中取出第一个元素

python
        ans.append(a.pop(0))

a.pop(0) 为列表操作之一,意为移除并返回列表中索引为 0 之元素,即列表首元素。然后将该元素附加到 ans 列表中,完成一次元素取出与存储之操作。

5. 重新排列剩余元素

python
        if a:
            temp = a.pop(0)
            a.append(temp)

此部分代码的作用是:若列表 a 中尚有剩余元素,则移除并保存列表中的首个元素 temp,随后将其追加至列表末尾。此操作相当于将列表的首元素移至末端,形成一种循环往复的效果。

6. 返回结果

python
    return ans

一旦 a 中所有元素均已处理,循环终止,函数返回最终生成的 ans 列表,作为解答。

三、例子解析

接下来,吾以例子来说明该算法之具体执行过程。

示例一

python
print(solution(n = 5, a = [5, 3, 2, 1, 4]) == [5, 2, 4, 1, 3])
  1. 初始列表为 [5, 3, 2, 1, 4]

  2. 首次循环:

    • 取出 5,ans = [5]
    • 剩余列表 [3, 2, 1, 4],取出 3 并移至末尾,列表变为 [2, 1, 4, 3]
  3. 第二次循环:

    • 取出 2,ans = [5, 2]
    • 剩余列表 [1, 4, 3],取出 1 并移至末尾,列表变为 [4, 3, 1]
  4. 第三次循环:

    • 取出 4,ans = [5, 2, 4]
    • 剩余列表 [3, 1],取出 3 并移至末尾,列表变为 [1, 3]
  5. 第四次循环:

    • 取出 1,ans = [5, 2, 4, 1]
    • 剩余列表 [3],取出 3 并移至末尾,列表变为 [3]
  6. 第五次循环:

    • 取出 3,ans = [5, 2, 4, 1, 3]
    • 此时列表为空,循环终止。

最终结果为 [5, 2, 4, 1, 3],与题目所给结果一致。

示例二

python
print(solution(n = 4, a = [4, 1, 3, 2]) == [4, 3, 1, 2])

过程与示例一相似,经过相同的循环操作,最终得到结果 [4, 3, 1, 2]

示例三

python
print(solution(n = 6, a = [1, 2, 3, 4, 5, 6]) == [1, 3, 5, 2, 6, 4])

同样,经过数轮元素的取出与重排,最终得到 [1, 3, 5, 2, 6, 4]

四、总结

此段代码通过循环控制,依次取出列表中的元素,并按特定规则将其重新排列。其主要思路在于:

  • 每次取出列表中的第一个元素,并加入到结果列表 ans
  • 然后将剩余元素中的第一个元素移至列表末尾。

此操作重复进行,直到列表为空,从而得到符合题意的结果。此类操作在处理队列类问题时尤为常见,能够模拟轮转和顺序变化。