← All notes
LeetCode Cycle 02:String / Array / Object 的 runtime 與 surrogate pair 陷阱
資深面試問 array 不是要你會 push/pop,而是要你解釋為什麼 shift 是 O(n)、為什麼 split('') 拆 emoji 會壞、為什麼 spread 跟 Array.from 反而對。內部使用。
LeetCode Cycle 02 在 Notion 的筆記只列了三件事:array 操作的 runtime 表、字串轉陣列的四種方法、Object 當 hash 用的取捨。看似基礎,但這組題在資深面試裡是篩面試官——junior 會背 push/pop 是 O(1),senior 要解釋 V8 內部為什麼 shift 必須 re-index,還要知道 '😋'.length === 2 背後是 UTF-16 surrogate pair[^1]。這篇把這三條主軸拆開,每條附對應的 LeetCode 題型跟現場踩過的雷。
Array 六個常用操作的 runtime 對照
先把表打出來,後面每一條都會回頭引用:
| 操作 | 動作 | runtime | 是否 mutate |
|---|---|---|---|
push(x) | 尾端新增 | O(1) amortized | 是 |
pop() | 尾端移除 | O(1) | 是 |
unshift(x) | 開頭新增 | O(n) | 是 |
shift() | 開頭移除 | O(n) | 是 |
slice(i, j) | 取子陣列回傳新陣列 | O(j-i) | 否 |
splice(i, deleteCount, ...items) | 從 i 開始增刪 | O(n) | 是 |
junior 在白板上寫到 arr.shift() 一臉沒事,senior 應該要在這一秒問自己:「我這一行剛剛做了一次 O(n) 操作,到底有沒有必要?」