前往
大廳
主題

LeetCode - 341. Flatten Nested List Iterator 解題心得

Not In My Back Yard | 2022-12-06 12:00:08 | 巴幣 0 | 人氣 299

題目連結:


題目意譯:
你被給定一個巢狀整數列表 nestedList。每個元素要嘛是一個整數或是一個列表,該列表元素也可能是整數或是其他的列表。實作一個疊代器(Iterator)來將這個列表攤平。

實作類別 NestedIterator:
NestedIterator(List<NestedInteger> nestedList) 以巢狀列表 nestedList 來初始化疊代器。
int next() 回傳巢狀列表中的下一個整數。
boolean hasNext() 回傳真(True)如果巢狀列表中仍存在著其他整數;反之回傳假(False)。

你的程式碼將由以下虛擬碼之過程來測試:
initialize iterator with nestedList
res = []
while iterator.hasNext()
    append iterator.next() to the end of res
return res

如果 res 與期望的攤平列表一致,則你的程式碼將會被接受。

限制:
1 ≦ nestedList.length ≦ 500
巢狀列表中的整數之值位於範圍 [-10 ^ 6, 10 ^ 6] 中。



範例測資:
範例 1:
輸入: nestedList = [[1,1],2,[1,1]]
輸出: [1,1,2,1,1]
解釋: 藉由不停地呼叫 next 直到 hasNext 回傳假為止,回傳的元素之順序應為:[1,1,2,1,1]。

範例 2:
輸入: nestedList = [1,[4,[6]]]
輸出: [1,4,6]
解釋: 藉由不停地呼叫 next 直到 hasNext 回傳假為止,回傳的元素之順序應為:[1,4,6].


解題思維:
定義列表 nestedList 的一個「基本疊代器」就是一個指向 nestedList 某個元素的指標。

只是因為這個 nestedList 可能包含著其他的 nestedList,所以我們需要利用一個堆疊來儲存「每一層的列表」之「基本疊代器」以及該層列表的「結尾」(用來判斷當前最上層(最裡層)的列表是否所有元素都看完了)。

因此 hasNext 就是一直疊代列表,看堆疊頂端的疊代器現在指到的是不是整數(利用題目預先定義的 API 函式 isInteger(參見範例程式碼 class 前的註解))。如果不是整數,就代表現在指到的是另一個列表,也就是說我們需要在堆疊上多放一個新的一層上去,然後繼續疊代這個新的列表。重複這個步驟直到我們找到整數或是把最外層的列表疊代完為止(因為有可能有列表是包著其他列表,但不包含任何一個整數)。

而 next 可以先呼叫一次 hasNext 確保現在疊代器指到的是整數(根據題目的虛擬碼,next 被呼叫的時候代表列表中一定還有整數存在(只要 hasNext 有寫對的話))。然後將當前疊代器指到的整數回傳並將疊代器往下一個位置移動即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作