Easy

题目描述

给你一个长度为 n 的整数数组 nums。请你构建一个长度为 2n 的答案数组 ans,数组下标从 0 开始计数,对于所有 0 <= i < ni,满足下述所有要求:

  • ans[i] == nums[i]
  • ans[i + n] == nums[i]

换句话说,ans 是两个 nums 数组串联形成的。

返回数组 ans

示例 1:

输入:nums = [1,2,1]
输出:[1,2,1,1,2,1]
解释:数组 ans 按下述方式形成:
- ans = [nums[0],nums[1],nums[2],nums[0],nums[1],nums[2]]
- ans = [1,2,1,1,2,1]

示例 2:

输入:nums = [1,3,2,1]
输出:[1,3,2,1,1,3,2,1]
解释:数组 ans 按下述方式形成:
- ans = [nums[0],nums[1],nums[2],nums[3],nums[0],nums[1],nums[2],nums[3]]
- ans = [1,3,2,1,1,3,2,1]

提示:

  • n == nums.length
  • 1 <= n <= 1000
  • 1 <= nums[i] <= 1000

解题思路

这是一道非常简单的数组模拟题,要求将原数组自己和自己串联起来。

思路分析

方法一:创建新数组并填充 最直观的做法是创建一个长度为 2n 的新数组,然后将原数组的元素复制两遍。具体步骤:

  1. 创建长度为 2 * nums.length 的结果数组
  2. 第一遍循环:将 nums[i] 复制到 ans[i](前半部分)
  3. 第二遍循环:将 nums[i] 复制到 ans[i + n](后半部分)

方法二:一次遍历 我们可以在一次遍历中同时填充前半部分和后半部分:

  • ans[i] = nums[i](前半部分)
  • ans[i + n] = nums[i](后半部分)

方法三:利用语言特性(推荐) 不同编程语言都提供了便捷的数组拼接方法:

  • Python:nums + nums
  • JavaScript:nums.concat(nums)
  • C#:可以使用 LINQ 或数组复制
  • C++:可以使用 insert 方法

代码实现采用方法二,因为它在所有语言中都很直观且高效。

代码实现

class Solution {
public:
    vector<int> getConcatenation(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans(2 * n);
        
        for (int i = 0; i < n; i++) {
            ans[i] = nums[i];
            ans[i + n] = nums[i];
        }
        
        return ans;
    }
};
class Solution:
    def getConcatenation(self, nums: List[int]) -> List[int]:
        return nums + nums
public class Solution {
    public int[] GetConcatenation(int[] nums) {
        int n = nums.Length;
        int[] ans = new int[2 * n];
        
        for (int i = 0; i < n; i++) {
            ans[i] = nums[i];
            ans[i + n] = nums[i];
        }
        
        return ans;
    }
}
var getConcatenation = function(nums) {
    return nums.concat(nums);
};

复杂度分析

复杂度大小
时间复杂度O(n)
空间复杂度O(n)

其中 n 为原数组的长度。时间复杂度为 O(n) 是因为需要遍历原数组;空间复杂度为 O(n) 是因为需要创建长度为 2n 的新数组(不考虑返回值占用的空间)。