题目描述

给你一个长度为 n 的整数数组 nums。请你构建一个长度为 2n 的答案数组 ansans 由两个 nums 数组串联形成。ans[i] == nums[i]ans[i + n] == nums[i]

例如:nums = [1,2,1],输出 [1,2,1,1,2,1]

解释:数组 ans 由两个 [1,2,1] 串联组成。

解题思路

核心思想

这是一个非常直接的数组操作问题,本质上是将原数组复制两遍拼接到一起。具体做法是:

  1. 创建一个长度为 2n 的新数组 ans
  2. 遍历原数组,将每个元素 nums[i] 分别放到 ans[i]ans[i + n] 两个位置。
  3. 一次遍历即可完成。

步骤

  1. ans = new int[nums.length * 2]
  2. 对于 i0nums.length - 1
    • ans[i] = nums[i]
    • ans[i + nums.length] = nums[i]
  3. 返回 ans

示例说明

nums = [1,2,1] 为例:

  • n = 3,ans 长度为 6
  • i=0:ans[0]=1, ans[3]=1
  • i=1:ans[1]=2, ans[4]=2
  • i=2:ans[2]=1, ans[5]=1
  • 结果:[1,2,1,1,2,1]

更简洁的写法

也可以使用 System.arraycopy()

1
2
3
int[] ans = new int[nums.length * 2];
System.arraycopy(nums, 0, ans, 0, nums.length);
System.arraycopy(nums, 0, ans, nums.length, nums.length);

复杂度分析

  • 时间复杂度O(n),一次遍历原数组。
  • 空间复杂度O(n)(不计结果数组),结果数组长度为 2n

代码

1
2
3
4
5
6
7
8
9
10
11
12
package code.J1929;

public class J1929 {
public int[] getConcatenation(int[] nums) {
int[] ans = new int[nums.length * 2];
for (int i = 0; i < nums.length; i++) {
ans[i] = nums[i];
ans[i + nums.length] = nums[i];
}
return ans;
}
}