青训营X豆包MarsCode 学习笔记:构造特定数组的逆序拼接|豆包MarsCode AI刷题

46 阅读3分钟

一、题目解析

问题描述
给定一个整数 n,要求构造一个特定的数组,其内容是从 1n 的整数,每个整数 i 都生成一个由从 ni 的逆序数字组成的子数组,然后将这些子数组按顺序拼接成一个大的数组。具体要求如下:

  1. 对于每个整数 i(从 1 到 n),构造一个包含 ni 的逆序数组。
  2. 将所有构造出的数组按顺序连接在一起。

输入输出说明

  • 输入:一个整数 n(1 ≤ n ≤ 100)。
  • 输出:一个数组,包含从 ni 逆序拼接的子数组。

测试样例

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

二、解题思路

1. 逆序拼接的构造

  • 从 1 到 n 遍历,对于每一个 i,我们需要生成一个包含从 ni 的逆序数组。这个数组可以通过 range(n, i - 1, -1) 来生成,range(n, i - 1, -1) 会从 n 递减到 i(包括 i)。

2. 拼接结果

  • 每生成一个逆序数组,就将它拼接到最终的结果数组中。可以使用 Python 中的 extend() 方法来将一个子数组扩展到结果数组中。

3. 时间复杂度

  • 每一轮的生成和拼接操作的时间复杂度为 O(k),其中 k 是当前生成数组的长度。从 1 到 n 生成数组的总时间复杂度为 O(n^2),这对于 n 最大为 100 时是可接受的。

三、代码实现

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

# 测试用例
if __name__ == '__main__':
    print(solution(3) == [3, 2, 1, 3, 2, 3])   # 示例 1
    print(solution(4) == [4, 3, 2, 1, 4, 3, 2, 4, 3, 4])  # 示例 2
    print(solution(5) == [5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5])  # 示例 3

四、知识总结

  1. range() 函数的使用:
    range() 是 Python 中非常重要的函数,能够用来生成一系列数字。特别是它支持三种参数:startstopstep,可以很方便地生成递增或递减的数字序列。在本题中,range(n, i - 1, -1) 用于生成递减的序列。
  2. extend() 方法:
    extend() 方法用于将一个可迭代对象的所有元素添加到列表中,这在本题中非常有用,可以避免重复使用 append() 方法逐个添加元素。
  3. 循环嵌套:
    本题中需要嵌套循环来完成从 1 到 n 的遍历,以及每次生成逆序数组并拼接的操作。理解如何利用嵌套循环来解决类似的问题对于提升编程能力很有帮助。

五、学习建议

  1. 多练习列表操作:
    在 Python 中,列表是常用的数据结构。学习如何高效地操作列表,包括增删改查、拼接等操作,将大大提高你的编程能力。
  2. 理解算法的时间复杂度:
    本题的时间复杂度为 O(n^2),这对于中小规模的问题是可以接受的。理解时间复杂度对于我们在面对大数据时选择合适的算法非常重要。
  3. 代码优化:
    在一些场景下,考虑代码的简洁性和效率是非常重要的。例如,本题中使用 extend() 替代了逐个 append() 的操作,极大提高了代码的简洁性和执行效率。

六、个人总结

这道题通过简单的嵌套循环和列表操作,帮助我进一步巩固了对 Python 中常用方法(如 range()extend())的理解。同时,问题的解决方式也让我对如何构造和拼接数组有了更深入的理解。尤其是对复杂的数组操作进行优化和简化,让我感受到编程中的优雅与高效。