Easy草稿★★★★★O(n) 時間 · O(1) 空間
Bit ManipulationArray
Patterns💡 位元技巧
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

1470Shuffle the ArrayBit ManipulationEasyBit Manipulation

給定陣列 nums,由 2n 個元素組成,格式為 [x1,x2,...,xn,y1,y2,...,yn]。回傳以 [x1,y1,x2,y2,...,xn,yn] 格式排列的陣列。

Example:

Input: nums = [2,5,1,3,4,7], n = 3 Output: [2,3,5,4,1,7]

Intuition

TIP

核心思路:前半部取 nums[i]、後半部取 nums[i+n],交替放入結果陣列。

Approaches

1. Extra Array — O(n) / O(n)
  • Idea: 建立新陣列,交替從前半和後半取值
  • Time: O(n)
  • Space: O(n) - 結果陣列
class Solution {
    fun shuffle(nums: IntArray, n: Int): IntArray {
        val result = IntArray(2 * n)
        for (i in 0 until n) {
            result[2 * i] = nums[i]
            result[2 * i + 1] = nums[i + n]
        }
        return result
    }
}
⭐ 2. Bit Packing (O(1) extra) — O(n) / O(1)
  • Idea: 因為值 <= 1000(< 2^10),可以把兩個值打包在一個 int 裡:高位存新值,低位存原值。最後再解包
  • Time: O(n)
  • Space: O(1) - 原地操作(不算輸出)
class Solution {
    fun shuffle(nums: IntArray, n: Int): IntArray {
        // 將配對資訊存入高位(值 <= 1000 < 1024 = 2^10)
        for (i in 0 until n) {
            nums[i] = nums[i] or (nums[i + n] shl 10)
        }

        // 從後往前解包,避免覆蓋未處理的資料
        for (i in n - 1 downTo 0) {
            val x = nums[i] and 0x3FF       // 低 10 位
            val y = (nums[i] shr 10) and 0x3FF  // 高 10 位
            nums[2 * i] = x
            nums[2 * i + 1] = y
        }

        return nums
    }
}

🔑 Takeaways