Arrays 101 最後一個小節是講in-place operations,中文翻譯是叫做原地操作,它的概念是說,不管今天是要對陣列做排序還是任何運算操作,都只在同一個陣列進行,不會另外建立一個新的陣列去儲存結果。
舉例來說,我們現在有個int[] a = {3, 2, 4, 1};
的陣列,對它進行排序操作之後是a = {1, 2, 3, 4};
而不是b = {1, 2, 3, 4};
,不建立新的陣列就可以達到我們想要的目的,這樣的操作就算是原地操作。
這個做法的好處在於節省空間,要記得,當我們new
一個東西時,不管是變數、陣列還是其他物件,都會在記憶體挖一個空間出來儲存資料,我們每複製一個陣列,佔用的空間就會倍數成長,直到系統拋出Out of Memory 的例外。
原地操作的部分很快就結束了,但這個小節有使用原地操作展示一個更好的刪除演算法。
假設我們取得的陣列是INPUT,我們想要的結果是OUTPUT,目的是刪除裡面重複的元素。
INPUT: [0, 0, 1, 1, 2, 3, 3, 4]
OUTPUT: [0, 1, 2, 3, 4]
在學習原地操作以前,最直觀的解法可能是建立一個新的陣列去儲存元素並回傳,如下圖:
但這邊我們可以使用原地操作,不斷交換第一次出現的元素到前面,然後length
變數設定在尾端,這樣我們就可以根據length
的位置,在同一個陣列操作不重複的元素。
在In-Place Operations 的章節裡就出了五道題目,不過有兩題是跟Deleting Items From an Array 的章節一樣,應該是想要讀者用原地操作去重新寫那兩道題目吧。
這邊還有再加上Arrays 101 最後Conclusion 章節的題目,其中個人認為比較難的是448 題,雖然也是Easy 的題目,但是這整個Explore Card 寫完唯一上網找答案的,那個解法真是讓人意想不到啊!!!
Arrays 101 最後總結了這個Explore Card 的內容:
最後還埋了兩個伏筆,Two Pointer
和Circular Array
,這將是未來的Explore Card 的內容,更多的陣列操作技巧!