青训营X豆包MarsCode 技术训练营 刷题 构造特定数组的逆序拼接 | 豆包MarsCode AI 刷题

33 阅读3分钟

问题理解

题目要求构造一个特定数组,该数组的构造规则是:对于每个 i1n,将数字 ni 逆序拼接,直到 i 等于 n 为止。最终,输出这个拼接后的数组。例如,当 n 等于 3 时,拼接后的数组是 [3, 2, 1, 3, 2, 3]

数据结构选择

为了动态地添加元素并最终转换为数组,我们选择使用 List<Integer> 来存储中间结果。List 提供了动态添加元素的功能,非常适合这种需要逐步构建结果的场景。最终,我们可以将 List 转换为数组并返回。

算法步骤

  1. 初始化结果列表

    • 创建一个 List<Integer> 来存储最终的结果。
  2. 外层循环

    • 使用一个外层循环遍历 i1n。这个循环的目的是控制每次拼接的起始位置。
  3. 内层循环

    • 在内层循环中,从 n 递减到 i,将每个数字添加到结果列表中。这个循环的目的是将当前范围内的数字逆序添加到结果列表中。
  4. 转换为数组

    • 当所有数字都添加到结果列表后,将 List 转换为数组。这一步可以通过遍历 List 并将每个元素复制到数组中来实现。
  5. 返回结果

    • 最终返回转换后的数组。

详细步骤解析

  1. 初始化结果列表

    • 使用 List<Integer> resultList = new ArrayList<>(); 初始化一个空的 ArrayList,用于存储最终的结果。
  2. 外层循环

    • 使用 for (int i = 1; i <= n; i++) 遍历 i1n。这个循环的目的是控制每次拼接的起始位置。每次循环开始时,i 的值决定了内层循环的起始位置。
  3. 内层循环

    • 使用 for (int j = n; j >= i; j--)n 递减到 i,将每个数字添加到结果列表中。这个循环的目的是将当前范围内的数字逆序添加到结果列表中。每次循环中,j 的值决定了当前要添加的数字。
  4. 转换为数组

    • 使用 int[] resultArray = new int[resultList.size()]; 创建一个与 resultList 大小相同的数组。然后使用 for (int k = 0; k < resultList.size(); k++) 遍历 resultList,将每个元素复制到数组中。
  5. 返回结果

    • 最终返回 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 来动态添加元素,并在最后转换为数组,是一种常见的编程技巧。这种做法不仅符合题目要求,而且在时间和空间复杂度上也较为合理。通过逐步构建结果,我们可以清晰地看到每一步的操作,从而更容易理解和调试代码。