📘 題目敘述
給你一個長度為 n 的整數陣列 nums,你想建立一個長度為 2n 的陣列 ans,使得對所有 0 <= i < n:
ans[i] == nums[i]ans[i + n] == nums[i]
也就是說,ans 是把兩個 nums 陣列串接起來後得到的結果。
請回傳陣列 ans。
條件限制
n == nums.length1 <= n <= 10001 <= nums[i] <= 1000
🧠 解題思路
這題很直接,題目已經把 ans 要長什麼樣子講得很清楚了:
- 前半段放一份
nums - 後半段再放一份
nums
所以我直接先開一個長度為 2n 的陣列 ans,然後跑一圈 nums:
- 把
nums[i]放到ans[i] - 再把同一個
nums[i]放到ans[i + n]
這樣一圈做完後,ans 的前半和後半就都填好了。
也就是說,這題的核心就是:
掃一次
nums,把每個元素同時放到答案陣列的前半和後半對應位置。
所有變數
n:nums的長度ans:答案陣列,大小是2 * n
🪜 主要流程步驟
1. 先取得 nums 的長度 n
int n = nums.size();
這一步先把陣列長度存起來,因為後面要用來:
- 開
2n大小的答案陣列 - 計算後半段的位置
i + n
2. 開一個長度為 2n 的答案陣列
vector<int> ans(2 * n);
因為題目要的答案長度就是 2n,所以直接先開好空間。
這樣後面就可以直接用 index 指定位置填值。
3. 掃一次 nums,把每個元素複製到前半和後半
for (int i = 0; i < n; i++) {
ans[i] = nums[i];
ans[i + n] = nums[i];
}
這一段就是整題的核心。
對每個 nums[i]:
ans[i] = nums[i]- 放到答案陣列前半段
ans[i + n] = nums[i]- 再放到答案陣列後半段
所以最後會變成:
ans[0 ... n-1]是第一份numsans[n ... 2n-1]是第二份nums
4. 回傳 ans
return ans;
當整個 nums 都掃完後,答案陣列就已經完整組好了,直接回傳即可。
⏱️ 複雜度
- 時間複雜度:
O(n)- 只掃一次
nums。
- 只掃一次
- 空間複雜度:
O(n)- 額外建立了一個長度為
2n的答案陣列,常數忽略後為O(n)。
- 額外建立了一個長度為
💻 程式碼實作
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;
}
};
🔗 題目連結
https://leetcode.com/problems/concatenation-of-array/