第五次的算法笔记 | 豆包MarsCode AI刷题

43 阅读3分钟

一、题目分析

本题要求根据给定的数字 n 来构造一个特定的数组。构造规则是针对从 1 到 n 的每一个 i 值,将数字从 n 到 i 逆序拼接起来,一直重复这个操作直到 i 等于 n 为止,最后输出拼接好的整个数组。通过给定的测试样例,比如 n = 3 时输出 [3, 2, 1, 3, 2, 3] 等,可以更直观地理解这个构造过程和预期结果。

二、代码实现思路讲解

(一)初始化结果列表

代码首先定义了一个空列表 resultresult = []),这个列表就是用来存放最终构造好的数组元素的,随着后续的操作,元素会不断被添加进去,逐步形成符合要求的数组。

(二)循环生成并拼接元素

使用了一个 for 循环(for i in range(1, n + 1):),这个循环的范围是从 1 到 n(包含 n),对应了题目中描述的针对每一个 i 值进行操作的要求。

  1. 生成逆序列表
    在每次循环内部,首先通过 list(range(n, i - 1, -1)) 来生成一个从 n 到 i 的逆序列表,这里巧妙地运用了 range 函数的特性。range 函数的三个参数分别表示起始值(这里是 n)、结束值(i - 1,因为 range 函数是左闭右开区间,所以要得到包含 i 的逆序范围,需要这样设置)以及步长(-1,表示每次递减 1,从而实现逆序)。例如,当 n = 4 ,i = 2 时,list(range(4, 2 - 1, -1)) 就会生成 [4, 3, 2] 这样一个逆序列表,它就是按照题目规则此时需要拼接的那一部分元素。
  2. 将逆序列表追加到结果列表中
    接着使用 result.extend(sub_list) 将刚生成的逆序列表 sub_list 中的所有元素追加到 result 列表中。还是以刚才 n = 4 ,i = 2 的例子来说,原本 result 列表可能已经有前面循环添加进来的元素了,执行这一步操作后,[4, 3, 2] 这些元素就会被依次添加到 result 列表后面,不断丰富这个结果列表的内容,使其逐渐符合最终要输出的完整数组的样子。

(三)返回结果

当 for 循环结束后,也就是针对从 1 到 n 的所有 i 值都完成了相应的逆序拼接操作后,通过 return result 将构造好的数组返回,这个数组就是按照题目给定规则生成的最终结果。

def solution(n: int) -> list:
    result = []
    for i in range(1, n + 1):
        # 生成从 n 到 i 的逆序列表
        sub_list = list(range(n, i - 1, -1))
        # 将逆序列表追加到 result 中
        result.extend(sub_list)
    return result

if __name__ == '__main__':
    print(solution(3) == [3, 2, 1, 3, 2, 3])
    print(solution(4) == [4, 3, 2, 1, 4, 3, 2, 4, 3, 4])
    print(solution(5) == [5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5])

image.png

三、测试样例分析

image.png

  • 样例 1
    输入 n = 3

    • 当 i = 1 时,通过 list(range(3, 1 - 1, -1)) 生成逆序列表 [3, 2, 1],然后将其追加到 result 列表中,此时 result = [3, 2, 1]
    • 当 i = 2 时,生成逆序列表 list(range(3, 2 - 1, -1)) = [3, 2],再追加到 result 中,result 变为 [3, 2, 1, 3, 2]
    • 当 i = 3 时,生成逆序列表 list(range(3, 3 - 1, -1)) = [3],追加后 result 最终为 [3, 2, 1, 3, 2, 3],与样例输出一致,符合题目要求。