构造特定数组 | 豆包MarsCode AI刷题

96 阅读3分钟

在本篇文章中我深入解析一下构造特定数组的逆序拼接这道题,并将讨论其解决思路、代码实现以及在使用豆包MarsCode AI刷题过程中获得的知识和学习方法。这道题的核心任务是根据给定的数字构造一个特定的数组。

题目要求

给定一个整数 n,我们需要构造一个数组,数组的生成规则是:

  • 对于每个 i 从 1 到 n,将从 n 到 i 的数字逆序拼接。
  • 最终输出拼接后的数组。

例如: 当 n = 3 时,拼接后的数组为 [3, 2, 1, 3, 2, 3]。 当 n = 4 时,拼接后的数组为 [4, 3, 2, 1, 4, 3, 2, 4, 3, 4]。 当 n = 5 时,拼接后的数组为 [5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5]。 通过观察这些样例,我们可以总结出以下几点: 数字 n 从开始到结束都会出现在数组的不同位置。 每一段拼接的数组是从 n 到当前值 i 的递减顺序。

题目难点

这道题的核心难点在于如何按规则高效生成数组。题目要求我们对于每个从 i=1 到 i=n 的数字,依次生成从 n 到 i 的数字序列,并将这些序列拼接到最终的数组中。直观的实现方法是使用两个嵌套的循环,外层循环控制 i 的变化,内层循环从 n 遍历到 i,将每个值添加到结果数组中。

算法分析

我们可以通过以下步骤来实现该算法: 1.外层循环:遍历从 1 到 n 的所有整数 i。对于每个 i,我们需要生成一个从 n 到 i 的递减序列。 2.内层循环:对于每个 i,内层循环从 n 到 i 递减,并将这些数字依次添加到结果数组 result 中。 3.输出结果:返回最终拼接好的数组。

时间复杂度分析

外层循环的次数是 n,因为它遍历从 1 到 n 的所有整数。 内层循环的次数为每个 i 对应的 n-i+1。因此,内层循环总的执行次数是一个等差数列的和,复杂度是 O(n^2)。 因此,这道题的时间复杂度是 O(n^2),空间复杂度是 O(n^2),因为我们需要存储一个大小为 n^2 的数组。

代码实现

接下来,我们提供该题的 C++ 代码实现:

#include #include using namespace std;

vector solution(int n) { vector result; // 外层循环,遍历1到n for (int i = 1; i <= n; ++i) { // 内层循环,从n到i逆序 for (int j = n; j >= i; --j) { result.push_back(j); } } return result; }

int main() { vector result1 = solution(3); cout << (result1 == vector{3, 2, 1, 3, 2, 3}) << endl;

vector<int> result2 = solution(4);
cout << (result2 == vector<int>{4, 3, 2, 1, 4, 3, 2, 4, 3, 4}) << endl;

vector<int> result3 = solution(5);
cout << (result3 == vector<int>{5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5}) << endl;

return 0;

}

代码解释

solution 函数:该函数接收一个整数 n,用于生成最终的数组。我们首先初始化一个空的 vector 类型数组 result。然后,外层循环控制从 1 到 n 的每个数字 i,内层循环从 n 到 i 逆序添加数字。 main 函数:通过三组不同的测试样例,检查 solution 函数的输出是否与预期结果一致。

测试用例

输入:n = 3,输出:[3, 2, 1, 3, 2, 3]。 输入:n = 4,输出:[4, 3, 2, 1, 4, 3, 2, 4, 3, 4]。 输入:n = 5,输出:[5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5]。 在使用豆包MarsCode AI刷题的过程中,我深刻体会到通过分解问题、分析题目要求和逐步优化代码的重要性。刚开始题都没看懂,通过借助豆包AI让他给我分析了一下题目才明白。