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