★ 付費 Premium 專享 ★
↑看個小廣告,支持好內容↑
陣列可以說是最常見的資料結構,LeetCode 裡的題目有過半都和 Array
有關,因此也通常是解題新手的第一站。在第一篇專文,我們就從它的操作方法講起。
兩者都是把東西放進陣列,只不過一個從頭放、一個則是從尾巴:
// arr=[1,2,3]
arr.unshift(4,5) // [4,5,1,2,3]
arr.push(4,5) // [1,2,3,4,5]
通常來說 push 會比較廣用,原因是陣列的每項資料都有固定的儲存位置,push
只要在末端加開一個空位,但 unshift
卻需要把每一項都向後搬移,不是很經濟的做法。
同上,一個從頭刪 O(n)
、一個則從尾巴 O(1)
。
// arr=[1,2,3,4]
arr.shift() // [2,3,4]
arr.pop() // [1,2,3]
上述四項操作都會直接改變陣列,若你還對棒球比賽有印象,這張圖你應該不陌生:
Stack
的操作都是從陣列的末端,我們可用 push、pop 來實現;而 Queue
則是尾進頭出,對應到的方法是 push 和 shift。
sort
也是原地變化的操作,預設的排序方式是根據字元 unicode。
// arr=[1,75,8,324,100]
arr.sort() // [1,100,324,75,8]
arr.sort((a,b)=>a-b) // [1,8,75,100,324]
arr.sort((a,b)=>b-a) // [324,100,75,8,1]
indexOf
會輸出第一個符合項目的位置;filter
則是回傳滿足條件者的陣列。
// arr=[1,75,8,324,100]
arr.indexOf(8) // 2
arr.indexOf(4) // -1 (沒有找到)
arr.filter(x=>x>80) // [324,100]
arr.filter(x=>x<=0) // [] (沒有找到)
新增、刪除、查詢甚至排列都有了,最後來玩點運算處理吧!
首先是文字轉換,陣列可以透過 join
將各項連接成文字,反之文字也可藉由 split
分割成一組陣列。
// arr=[1,0,1,1,0,0,1]
arr.join("") // "1011001"
arr.join("#") // "1#0#1#1#0#0#1" (以#作為連接符)
reduce
我們教過了,公式還記得嗎?