青训营X豆包MarsCode技术训练|豆包MarsCode AI 刷题

59 阅读3分钟

刷题笔记: 题目:

构造特定数组的逆序拼接

问题描述

小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]

思路解析

  1. 理解题意

    • 给定一个正整数 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]
    • 最终的结果是将这些部分合并在一起。

  2. 结构分析

    • 结果数组的结构是由不同的拼接部分构成的。
    • 每次循环 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}));
    }
}

代码工作流程

  1. 数据结构

    • 使用 List<Integer> 来动态存储结果,方便后续操作。
  2. 双重循环

    • 外层循环遍历 i 从 1 到 n
    • 内层循环从 n 逆序到 i,将每个值添加到结果列表中。
  3. 数组转换

    • 将 List 转换为 int[] 数组以符合返回值要求。
  4. 测试用例

    • 通过 Arrays.equals 方法检查输出与预期结果是否一致。

复杂度分析

  • 时间复杂度:O(n^2),因为对于每个 i,需要从 n 到 i 进行拼接操作。
  • 空间复杂度:O(n^2),由于我们存储了所有拼接的结果在列表中。