1929. Concatenation of Array

練習日期:2026-03-12

難度:Easy

類型:Array、Simulation

📘 題目敘述

給你一個長度為 n 的整數陣列 nums,你想建立一個長度為 2n 的陣列 ans,使得對所有 0 <= i < n

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

也就是說,ans 是把兩個 nums 陣列串接起來後得到的結果。

請回傳陣列 ans

條件限制

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

🧠 解題思路

這題很直接,題目已經把 ans 要長什麼樣子講得很清楚了:

  • 前半段放一份 nums
  • 後半段再放一份 nums

所以我直接先開一個長度為 2n 的陣列 ans,然後跑一圈 nums

  • nums[i] 放到 ans[i]
  • 再把同一個 nums[i] 放到 ans[i + n]

這樣一圈做完後,ans 的前半和後半就都填好了。

也就是說,這題的核心就是:

掃一次 nums,把每個元素同時放到答案陣列的前半和後半對應位置。

所有變數

  • nnums 的長度
  • 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] 是第一份 nums
  • ans[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/

作者: scottnick
撰寫日期: 2026-03-12
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/1929-concatenation-of-array.html