刷题笔记: 题目:
构造特定数组的逆序拼接
问题描述
小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从 1 到n,我们需要将n到i的数字逆序拼接到结果数组中。 -
例如,对于
n = 3,我们从i = 1到i = 3进行拼接:- 当
i = 1:拼接3, 2, 1→[3, 2, 1] - 当
i = 2:拼接3, 2→[3, 2] - 当
i = 3:拼接3→[3]
- 当
-
最终的结果是将这些部分合并在一起。
-
-
结构分析:
- 结果数组的结构是由不同的拼接部分构成的。
- 每次循环
i,我们会从n逆序到i,将这些值添加到结果数组中。
图解
对于 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]
代码详解
以下是实现代码的详细解释:
javaCopy Code
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static int[] solution(int n) {
List<Integer> result = new ArrayList<>(); // 用于存储结果
// 外层循环,遍历 i 从 1 到 n
for (int i = 1; i <= n; i++) {
// 内层循环,逆序拼接 n 到 i
for (int j = n; j >= i; j--) {
result.add(j); // 添加当前值 j 到结果列表
}
}
// 将结果列表转换为数组
int[] arr = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
arr[i] = result.get(i); // 将列表中的元素复制到数组中
}
return arr; // 返回最终的数组
}
public static void main(String[] args) {
// 测试用例,验证代码的正确性
System.out.println(Arrays.equals(solution(3), new int[]{3, 2, 1, 3, 2, 3}));
System.out.println(Arrays.equals(solution(4), new int[]{4, 3, 2, 1, 4, 3, 2, 4, 3, 4}));
System.out.println(Arrays.equals(solution(5), new int[]{5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5}));
}
}
代码工作流程
-
数据结构:
- 使用
List<Integer>来动态存储结果,方便后续操作。
- 使用
-
双重循环:
- 外层循环遍历
i从 1 到n。 - 内层循环从
n逆序到i,将每个值添加到结果列表中。
- 外层循环遍历
-
数组转换:
- 将
List转换为int[]数组以符合返回值要求。
- 将
-
测试用例:
- 通过
Arrays.equals方法检查输出与预期结果是否一致。
- 通过
复杂度分析
- 时间复杂度:O(n^2),因为对于每个
i,需要从n到i进行拼接操作。 - 空间复杂度:O(n^2),由于我们存储了所有拼接的结果在列表中。