一,题目详情
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
二,解题思路
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的逆序列表,并将其添加到结果数组中。
具体步骤如下:
- 初始化一个空的结果数组result。
- 遍历i从1到n: a. 生成一个从n到i的逆序列表。 b. 将这个逆序列表添加到result中。
- 返回result。
3,逐步推演(以样例1为例)
输入n=3,推演过程如下:
| 步骤 | i | 生成的逆序列表 | result |
|---|---|---|---|
| 初始 | - | - | [] |
| 1 | 1 | [3, 2, 1] | [3, 2, 1] |
| 2 | 2 | [3, 2] | [3, 2, 1, 3, 2] |
| 3 | 3 | [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])
四,总结
通过循环和列表生成,我们实现了:
- 构造特定数组:按照题目要求生成逆序拼接的数组
- 清晰的逻辑:分步生成每个逆序列表并拼接
- 普适性:适用于所有正整数n
这种解法不仅直观,还易于理解和实现。当遇到“需要按照特定规则构造数组”类问题时,循环和列表操作往往是解决问题的关键工具。