在不改變某些元素位置的情況下反轉 JavaScript 陣列
在這個問題陳述中,我們的目標是編寫一個使用 Javascript 反轉陣列的函式,同時不改變某些元素的位置。為此,我們將跟蹤保留元素的索引。
理解問題陳述
問題是建立一個 Javascript 函式來反轉陣列,但陣列中的某些元素必須保持其位置不變。因此,這些元素在原始陣列和反轉陣列中的位置應該相同。
例如,假設我們有一個數組 [1, 2, 3, 4, 5, 6]。如果我們想使用 Javascript 中內建的 reverse 函式反轉此陣列,我們將得到 [6, 5, 4, 3, 2, 1]。但是,如果我們必須保留元素 [2, 4, 6] 的位置,那麼反轉後的陣列將如下所示:[6, 5, 3, 4, 2, 1]。
因此,我們的目標是找到能夠滿足上述要求的反轉陣列的演算法。
上述問題的邏輯
實現上述問題有多種方法。這裡關鍵的想法是跟蹤保留項的位置,並在需要時將其與反轉陣列中的對應項交換。
該函式將接收陣列和要保留的元素陣列作為輸入,並返回一個新陣列,該陣列是所述陣列的反轉,但保留了元素。完成此操作後,我們將使用 reverse 方法建立陣列的反轉副本。然後遍歷原始陣列的索引,並檢查每個索引是否引用保留項的索引。如果條件為真,則只需繼續執行下一個元素,而不更改位置。如果條件為假,則只需交換它以反轉它。
演算法
步驟 1 - 建立一個函式來反轉陣列的元素,而不改變保留陣列的位置。
步驟 2 - 使用一個變數來儲存保留元素的索引。
步驟 3 - 使用 reverse 方法反轉實際輸入陣列的元素。
步驟 4 - 使用 for 迴圈使用 i 遍歷輸入陣列的項。在迴圈內部,檢查條件,如果保留索引具有 i 索引,則繼續。
步驟 5 - 如果上述條件不為真,則使用 arr.length - 1 -i 計算反轉陣列中的索引,並檢查它是否屬於保留項。
步驟 6 - 如果它不屬於,則演算法將使用解構賦值將項交換到其原始位置。
演算法程式碼
function reverseArray(arr, preservePosition) { const preservedIndex = new Set(preservePosition.map((el) => arr.indexOf(el))); const reversedArr = arr.reverse(); for (let i = 0; i < arr.length; i++) { if (preservedIndex.has(i)) { continue; } const reversedIndex = arr.length - 1 - i; if (preservedIndex.has(reversedIndex)) { // swap the elements in their original positions [reversedArr[i], reversedArr[reversedIndex]] = [arr[i], arr[reversedIndex]]; } } return reversedArr; } const arr = [12, 22, 35, 44, 52, 35, 68]; const preservePosition = [22, 44, 68]; const reversedArr = reverseArray(arr, preservePosition); console.log(reversedArr);
複雜度
實現演算法的時間複雜度為 O(n),其中 n 是陣列的長度。因為演算法對陣列中的每個元素執行恆定的工作量。空間複雜度也是 O(n),因為我們只儲存大小為 n 的反轉陣列。
結論
以上程式碼提供了一種有效的解決方案,可以在 Javascript 中反轉陣列,而無需更改某些項的實際位置。因此,它具有 O(n) 的時間複雜度和 O(n) 的空間複雜度。