问题理解
题目要求构造一个特定数组,该数组的构造规则是:对于每个 i 从 1 到 n,将数字 n 到 i 逆序拼接,直到 i 等于 n 为止。最终,输出这个拼接后的数组。例如,当 n 等于 3 时,拼接后的数组是 [3, 2, 1, 3, 2, 3]。
数据结构选择
为了动态地添加元素并最终转换为数组,我们选择使用 List<Integer> 来存储中间结果。List 提供了动态添加元素的功能,非常适合这种需要逐步构建结果的场景。最终,我们可以将 List 转换为数组并返回。
算法步骤
-
初始化结果列表:
- 创建一个
List<Integer>来存储最终的结果。
- 创建一个
-
外层循环:
- 使用一个外层循环遍历
i从1到n。这个循环的目的是控制每次拼接的起始位置。
- 使用一个外层循环遍历
-
内层循环:
- 在内层循环中,从
n递减到i,将每个数字添加到结果列表中。这个循环的目的是将当前范围内的数字逆序添加到结果列表中。
- 在内层循环中,从
-
转换为数组:
- 当所有数字都添加到结果列表后,将
List转换为数组。这一步可以通过遍历List并将每个元素复制到数组中来实现。
- 当所有数字都添加到结果列表后,将
-
返回结果:
- 最终返回转换后的数组。
详细步骤解析
-
初始化结果列表:
- 使用
List<Integer> resultList = new ArrayList<>();初始化一个空的ArrayList,用于存储最终的结果。
- 使用
-
外层循环:
- 使用
for (int i = 1; i <= n; i++)遍历i从1到n。这个循环的目的是控制每次拼接的起始位置。每次循环开始时,i的值决定了内层循环的起始位置。
- 使用
-
内层循环:
- 使用
for (int j = n; j >= i; j--)从n递减到i,将每个数字添加到结果列表中。这个循环的目的是将当前范围内的数字逆序添加到结果列表中。每次循环中,j的值决定了当前要添加的数字。
- 使用
-
转换为数组:
- 使用
int[] resultArray = new int[resultList.size()];创建一个与resultList大小相同的数组。然后使用for (int k = 0; k < resultList.size(); k++)遍历resultList,将每个元素复制到数组中。
- 使用
-
返回结果:
- 最终返回
resultArray,即转换后的数组。
- 最终返回
复杂度分析
-
时间复杂度:
- 外层循环执行
n次,内层循环每次执行n - i + 1次。因此,总的时间复杂度为O(n^2)。
- 外层循环执行
-
空间复杂度:
- 主要的空间消耗在于
resultList,其大小为n * (n + 1) / 2,即O(n^2)。最终转换为数组的空间复杂度也是O(n^2)。
- 主要的空间消耗在于
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static int[] solution(int n) {
// 使用 List 来动态添加元素
List<Integer> resultList = new ArrayList<>();
// 外层循环,遍历 i 从 1 到 n
for (int i = 1; i <= n; i++) {
// 内层循环,从 n 递减到 i,将每个数字添加到 resultList
for (int j = n; j >= i; j--) {
// 将 j 添加到 resultList
resultList.add(j);
}
}
// 将 List 转换为数组并返回
int[] resultArray = new int[resultList.size()];
for (int k = 0; k < resultList.size(); k++) {
resultArray[k] = resultList.get(k);
}
return resultArray;
}
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 来动态添加元素,并在最后转换为数组,是一种常见的编程技巧。这种做法不仅符合题目要求,而且在时间和空间复杂度上也较为合理。通过逐步构建结果,我们可以清晰地看到每一步的操作,从而更容易理解和调试代码。