构造特定数组的逆序拼接 | 豆包MarsCode AI刷题

8 阅读3分钟

构造特定数组的逆序拼接

问题描述

小U得到了一个数字n,他的任务是构造一个特定数组。这个数组的构造规则是:对于每个i从1到n,将数字n到i逆序拼接,直到i等于n为止。最终,输出这个拼接后的数组。

例如,当n等于3时,拼接后的数组是 [3, 2, 1, 3, 2, 3]


测试样例

样例1:

输入:n = 3
输出:[3, 2, 1, 3, 2, 3]

样例2:

输入:n = 4
输出:[4, 3, 2, 1, 4, 3, 2, 4, 3, 4]

样例3:

输入:n = 5
输出:[5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5]

问题描述

构造一个特定数组,对于每个 i 从 1 到 n,将数字 n 到 i 逆序拼接,直到 i 等于 n 为止。最终输出这个拼接后的数组。

解题思路

  1. 理解题目要求

    • 对于每个 i 从 1 到 n,生成从 n 到 i 的逆序序列。
    • 将这些逆序序列拼接成一个最终的数组。
  2. 数据结构选择

    • 使用一个列表来存储最终的结果。
  3. 算法步骤

    • 初始化一个空列表 result

    • 使用一个循环从 1 到 n,对于每个 i

      • 生成从 n 到 i 的逆序序列。
      • 将这个逆序序列追加到 result 中。
    • 返回 result 列表。

代码实现

    result = []  # 初始化结果列表
    
    for i in range(1, n + 1):
        # 生成从 n 到 i 的逆序序列
        reverse_seq = list(range(n, i - 1, -1))
        # 将这个逆序序列追加到 result 中
        result.extend(reverse_seq)
    
    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])

关键点

  1. 生成逆序序列

    • 使用 range(n, i - 1, -1) 生成从 n 到 i 的逆序序列。
    • 将生成的逆序序列转换为列表 reverse_seq
  2. 追加到结果列表

    • 使用 result.extend(reverse_seq) 将生成的逆序序列追加到 result 列表中。
  3. 返回结果

    • 最终返回 result 列表。

测试样例

  • n = 3 时,输出 [3, 2, 1, 3, 2, 3]
  • n = 4 时,输出 [4, 3, 2, 1, 4, 3, 2, 4, 3, 4]
  • n = 5 时,输出 [5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5]

总结

  • 通过循环和列表操作,可以有效地构造出符合题目要求的数组。
  • 理解逆序序列的生成和拼接是解决这个问题的关键。

补充内容

1. 逆序序列的生成

  • 使用 range() 函数range(n, i - 1, -1) 可以生成从 n 到 i 的逆序序列。

    • n 是起始值。
    • i - 1 是结束值(不包含)。
    • -1 是步长,表示逆序。
  • 转换为列表:使用 list() 函数将 range 对象转换为列表。

2. 列表的拼接

  • 使用 extend() 方法result.extend(reverse_seq) 可以将 reverse_seq 列表中的所有元素追加到 result 列表中。

    • extend() 方法比 append() 更适合这种情况,因为它可以将多个元素一次性追加到列表中。

3. 时间复杂度分析

  • 时间复杂度:该算法的时间复杂度为 O(n^2),因为对于每个 i,我们需要生成一个长度为 n - i + 1 的逆序序列,并将其追加到结果列表中。
  • 空间复杂度:该算法的空间复杂度为 O(n^2),因为最终的结果列表的长度是 n + (n-1) + (n-2) + ... + 1,即 n * (n + 1) / 2

4. 代码优化

  • 优化思路:如果 n 非常大,可以考虑使用生成器来逐个生成逆序序列的元素,而不是一次性生成整个列表。这样可以减少内存占用。