Description

給定長度為 n 的整數陣列 nums,建立一個長度為 2n 的陣列 ans,使得 ans[i] == nums[i]ans[i + n] == nums[i](0-indexed)。也就是將 nums 串接自己。

Example:

Input: nums = [1,2,1] Output: [1,2,1,1,2,1]

Intuition#

核心思路:將陣列複製一份接在後面即可。可以直接建立新陣列,也可以用 Kotlin 內建函式簡潔完成。

  • 建立長度 2n 的陣列,前 n 個和後 n 個都填入 nums 的值
  • 利用取模運算 i % n 可以統一處理索引

Approaches#

1: 直接複製#

  • 概念: 建立長度為 2n 的陣列,用兩次迴圈或取模填值
  • 時間複雜度: O(n) - 遍歷一次
  • 空間複雜度: O(n) - 輸出陣列(不計入則 O(1))
class Solution {
    fun getConcatenation(nums: IntArray): IntArray {
        val n = nums.size
        val ans = IntArray(2 * n)
        for (i in 0 until 2 * n) {
            ans[i] = nums[i % n]
        }
        return ans
    }
}

⭐2: Kotlin 內建函式#

  • 概念: 使用 + 運算子直接串接兩個陣列
  • 時間複雜度: O(n) - 內部仍需複製
  • 空間複雜度: O(n) - 輸出陣列
class Solution {
    fun getConcatenation(nums: IntArray): IntArray {
        return nums + nums
    }
}
補充:System.arraycopy

使用 Java 原生方法進行陣列複製,效能上可能略優。

class Solution {
    fun getConcatenation(nums: IntArray): IntArray {
        val n = nums.size
        val ans = IntArray(2 * n)
        System.arraycopy(nums, 0, ans, 0, n)
        System.arraycopy(nums, 0, ans, n, n)
        return ans
    }
}

🔑 Takeaways#

  • Pattern: 陣列基本操作,考驗語言熟練度
  • 關鍵技巧: 取模 i % n 可以處理循環索引;Kotlin 的 + 運算子可以直接串接 IntArray