檢查 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)。

更新於:2023年8月22日

695 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告