檢查 JavaScript 陣列中是否包含連續元素,但無需排序
以上語句要求我們使用 JavaScript 功能檢查陣列中的元素是否連續,且無需對陣列進行排序。我們可以使用一些基本的 JavaScript 功能來解決這個問題。讓我們看看如何做到這一點!
什麼是陣列中的連續元素?
連續元素意味著序列中每個後續元素都應該大於或小於前一個元素。例如,我們有一個數組 [1, 2, 3, 4, 5],在這裡我們可以看到陣列包含所有連續的元素,因為它們按遞增順序排列,所以輸出應為 true,因為它們是連續的。
示例
輸入
11 12 13
輸出
True
輸入
21 11 10
輸出
False
上述問題的邏輯
在解決上述問題陳述之前,我們需要了解其背後的邏輯,以便為其建立一個演算法。
正如我們上面所討論的,連續元素應該按遞增順序或遞減順序排列。因此,為了確保給定的序列按這些順序排列,找到陣列的最大和最小元素。然後我們將檢查陣列的長度,如果陣列只有一個元素,則返回 false,否則繼續前進。之後,藉助 for 迴圈,我們將迭代所有元素並檢查每個元素的條件。
最後,我們將結果以布林值的形式給出。如果序列遵循升序或降序,則結果顯示為 true,否則為 false。
演算法
步驟 1 − 開始定義名為 consecutive 的函式,並將輸入陣列傳遞給它。
步驟 2 − 繼續執行上述步驟,找出輸入陣列的最小值和最大值。
步驟 3 − 之後檢查最大值和最小值的差是否不等於輸入陣列的長度。如果條件滿足,則返回 false。
步驟 4 − 在第四步初始化一個 for 迴圈,並執行此迴圈直到陣列的長度。
步驟 5 − 最後,顯示給定陣列的結果為 true 或 false。
示例
//define a function to check elements are consecutive or not function consecutive(arr) { let min = Math.min(...arr); let max = Math.max(...arr); if (max - min !== arr.length - 1) { return false; } for (let i = 0; i < arr.length; i++) { if (arr.indexOf(min + i) === -1) { return false; } } return true; } //define different arrays with different elements const arr1 = [1, 2, 3, 4, 5]; const arr2 = [13, 12, 11, 10]; const arr3 = [8, 4, 5, 6, 7, 10]; console.log(consecutive(arr1)); console.log(consecutive(arr2)); console.log(consecutive(arr3));
輸出
true true false
演算法 − 無 for 迴圈
步驟 1 − 開始查詢陣列中的最小和最大元素。
步驟 2 − 繼續執行第一步,計算連續元素的預期總和。
步驟 3 − 執行第二步後,使用 Javascript 的 reduce 方法計算陣列中元素的實際總和。
步驟 4 − 最後比較步驟 2 和步驟 3 的總和,以找出陣列是否包含連續項。
示例
//define a function to check elements function consecutive(arr) { const min = Math.min(...arr); const max = Math.max(...arr); const expectedSum = (max - min + 1) * (max + min) / 2; const actualSum = arr.reduce((sum, num) => sum + num, 0); return expectedSum === actualSum; } const arr1 = [13, 12, 11, 10]; const arr2 = [8, 4, 5, 6, 7, 10]; const arr3 = [1, 2, 3, 4, 5]; console.log(consecutive(arr1)); console.log(consecutive(arr2)); console.log(consecutive(arr3));
輸出
true false true
複雜度
我們已經看到兩種解決此問題的方法。對於第一種方法,它使用 for 迴圈,此迴圈執行到陣列的長度。因此,時間複雜度將為 O(n),此程式碼的空間複雜度將為 O(1),因為它儲存一個布林值,該值佔用恆定空間。對於第二種方法,時間複雜度為 O(n),因為該函式迭代陣列的所有元素。Math.min 和 Math.max 函式也需要 O(n) 時間。空間複雜度為 O(1),因為儲存布林值。
結論
我們學習瞭如何檢查陣列中的元素是否連續。我們建立了兩種演算法,並看到了不同陣列輸入的不同輸出。兩種方法的時間和空間複雜度都相同,均為 O(n) 和 O(1)。