一、题目分析
本题要求根据给定的数字 n 来构造一个特定的数组。构造规则是针对从 1 到 n 的每一个 i 值,将数字从 n 到 i 逆序拼接起来,一直重复这个操作直到 i 等于 n 为止,最后输出拼接好的整个数组。通过给定的测试样例,比如 n = 3 时输出 [3, 2, 1, 3, 2, 3] 等,可以更直观地理解这个构造过程和预期结果。
二、代码实现思路讲解
(一)初始化结果列表
代码首先定义了一个空列表 result(result = []),这个列表就是用来存放最终构造好的数组元素的,随着后续的操作,元素会不断被添加进去,逐步形成符合要求的数组。
(二)循环生成并拼接元素
使用了一个 for 循环(for i in range(1, n + 1):),这个循环的范围是从 1 到 n(包含 n),对应了题目中描述的针对每一个 i 值进行操作的要求。
- 生成逆序列表
在每次循环内部,首先通过list(range(n, i - 1, -1))来生成一个从n到i的逆序列表,这里巧妙地运用了range函数的特性。range函数的三个参数分别表示起始值(这里是n)、结束值(i - 1,因为range函数是左闭右开区间,所以要得到包含i的逆序范围,需要这样设置)以及步长(-1,表示每次递减1,从而实现逆序)。例如,当n = 4,i = 2时,list(range(4, 2 - 1, -1))就会生成[4, 3, 2]这样一个逆序列表,它就是按照题目规则此时需要拼接的那一部分元素。 - 将逆序列表追加到结果列表中
接着使用result.extend(sub_list)将刚生成的逆序列表sub_list中的所有元素追加到result列表中。还是以刚才n = 4,i = 2的例子来说,原本result列表可能已经有前面循环添加进来的元素了,执行这一步操作后,[4, 3, 2]这些元素就会被依次添加到result列表后面,不断丰富这个结果列表的内容,使其逐渐符合最终要输出的完整数组的样子。
(三)返回结果
当 for 循环结束后,也就是针对从 1 到 n 的所有 i 值都完成了相应的逆序拼接操作后,通过 return result 将构造好的数组返回,这个数组就是按照题目给定规则生成的最终结果。
def solution(n: int) -> list:
result = []
for i in range(1, n + 1):
# 生成从 n 到 i 的逆序列表
sub_list = list(range(n, i - 1, -1))
# 将逆序列表追加到 result 中
result.extend(sub_list)
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:
输入n = 3。- 当
i = 1时,通过list(range(3, 1 - 1, -1))生成逆序列表[3, 2, 1],然后将其追加到result列表中,此时result = [3, 2, 1]。 - 当
i = 2时,生成逆序列表list(range(3, 2 - 1, -1)) = [3, 2],再追加到result中,result变为[3, 2, 1, 3, 2]。 - 当
i = 3时,生成逆序列表list(range(3, 3 - 1, -1)) = [3],追加后result最终为[3, 2, 1, 3, 2, 3],与样例输出一致,符合题目要求。
- 当
、