青训营X豆包MarsCode 技术训练营:AI刷题 问题13:构造特定数组的逆序拼接| 豆包MarsCode AI 刷题

61 阅读2分钟

问题描述

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

问题分析

根据题目的描述,任务是构造一个数组,该数组是通过按照一定规则将数字 ni 的数字逆序拼接得到的,其中 i 从 1 到 n

具体地,我们需要:

  • 对于每个 i 从 1 到 n,将从 ni 的数字逆序拼接。
  • 最终的结果是将所有这些拼接的部分按顺序组合成一个新的数组。

例子解析

  • 当 n = 3 时

    • 对于 i = 1,逆序拼接的部分是 [3, 2, 1]
    • 对于 i = 2,逆序拼接的部分是 [3, 2]
    • 对于 i = 3,逆序拼接的部分是 [3]
    • 最终数组是 [3, 2, 1, 3, 2, 3]
  • 当 n = 4 时

    • 对于 i = 1,逆序拼接的部分是 [4, 3, 2, 1]
    • 对于 i = 2,逆序拼接的部分是 [4, 3, 2]
    • 对于 i = 3,逆序拼接的部分是 [4, 3]
    • 对于 i = 4,逆序拼接的部分是 [4]
    • 最终数组是 [4, 3, 2, 1, 4, 3, 2, 4, 3, 4]

解题思路

  1. 逐步构造数组

    • i = 1i = n,对于每个 i,逆序生成从 ni 的数字序列,并将其加入结果数组。
  2. 具体操作

    • 对于每个 i,我们可以使用一个列表切片或者 range 来生成从 ni 的数字逆序。
    • 将每个生成的子数组拼接到最终数组中。

代码实现

def solution(n: int) -> list:
    result = []
    for i in range(1, n + 1):
        # 生成从 n 到 i 的数字逆序数组
        result.extend(range(n, i - 1, -1))
    return result

代码解析

  • range(n, i - 1, -1)

    • range(n, i - 1, -1) 生成一个从 ni(包括 ni)的数字序列,逆序排列。
    • 例如,range(5, 2, -1) 会生成 [5, 4, 3]
  • result.extend()

    • result.extend() 用于将每次生成的逆序数字数组添加到结果数组中。

时间复杂度

对于每个 i,我们生成的数组的长度是 n - i + 1,所以时间复杂度是:

  • 生成数组的总长度是 n + (n-1) + (n-2) + ... + 1,即总的长度为 n * (n + 1) / 2
  • 因此,时间复杂度是 O(n^2)