Easy
题目描述
给你一个长度为 n 的整数数组 nums。请你构建一个长度为 2n 的答案数组 ans,数组下标从 0 开始计数,对于所有 0 <= i < n 的 i,满足下述所有要求:
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.length1 <= n <= 10001 <= nums[i] <= 1000
解题思路
这是一道非常简单的数组模拟题,要求将原数组自己和自己串联起来。
思路分析
方法一:创建新数组并填充
最直观的做法是创建一个长度为 2n 的新数组,然后将原数组的元素复制两遍。具体步骤:
- 创建长度为
2 * nums.length的结果数组 - 第一遍循环:将
nums[i]复制到ans[i](前半部分) - 第二遍循环:将
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 的新数组(不考虑返回值占用的空间)。