使用 Python 解题 - 构造特定数组的逆序拼接

77 阅读3分钟

一,题目详情

1,问题描述

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

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

2,测试样例

样例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]

3,约束条件

  • 1 ≤ n ≤ 1000

image.png

二,解题思路

1,问题分析

我们需要构造一个数组,对于每个i从1到n,将数字n到i逆序拼接。例如,当i=1时,生成n到1的逆序列表;当i=2时,生成n到2的逆序列表,依此类推,直到i=n时,生成n到n的逆序列表(只有一个元素n)。

2,算法策略

我们可以使用一个循环来遍历每个i,从1到n。对于每个i,生成一个从n到i的逆序列表,并将其添加到结果数组中。

具体步骤如下:

  1. 初始化一个空的结果数组result。
  2. 遍历i从1到n: a. 生成一个从n到i的逆序列表。 b. 将这个逆序列表添加到result中。
  3. 返回result。

3,逐步推演(以样例1为例)

输入n=3,推演过程如下:

步骤i生成的逆序列表result
初始--[]
11[3, 2, 1][3, 2, 1]
22[3, 2][3, 2, 1, 3, 2]
33[3][3, 2, 1, 3, 2, 3]

最终结果与预期一致。

三,代码实现

Python复制

def solution(n: int) -> list:
    result = []
    for i in range(1, n + 1):
        sub_list = list(range(n, i - 1, -1))
        result.extend(sub_list)
    return result

1,复杂度分析

  • 时间复杂度:O(n^2)

    • 外层循环运行n次,内层生成逆序列表的时间复杂度为O(n)
  • 空间复杂度:O(n^2)

    • 结果数组的长度为1 + 2 + 3 + ... + n = n(n+1)/2

2,边界测试

Python复制

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

    # 边界测试:n=1
    print(solution(1) == [1])

    # 边界测试:n=2
    print(solution(2) == [2, 1, 2])

四,总结

通过循环和列表生成,我们实现了:

  1. 构造特定数组:按照题目要求生成逆序拼接的数组
  2. 清晰的逻辑:分步生成每个逆序列表并拼接
  3. 普适性:适用于所有正整数n

这种解法不仅直观,还易于理解和实现。当遇到“需要按照特定规则构造数组”类问题时,循环和列表操作往往是解决问题的关键工具。

企业微信截图_17420429096079.png