问题描述
小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]
问题分析
根据题目的描述,任务是构造一个数组,该数组是通过按照一定规则将数字 n 到 i 的数字逆序拼接得到的,其中 i 从 1 到 n。
具体地,我们需要:
- 对于每个
i从 1 到n,将从n到i的数字逆序拼接。 - 最终的结果是将所有这些拼接的部分按顺序组合成一个新的数组。
例子解析
-
当 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]。
- 对于
解题思路
-
逐步构造数组:
- 从
i = 1到i = n,对于每个i,逆序生成从n到i的数字序列,并将其加入结果数组。
- 从
-
具体操作:
- 对于每个
i,我们可以使用一个列表切片或者range来生成从n到i的数字逆序。 - 将每个生成的子数组拼接到最终数组中。
- 对于每个
代码实现
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)生成一个从n到i(包括n和i)的数字序列,逆序排列。- 例如,
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)。