用于在数组中查找 non-sequential 个槽(孔)的 for 循环方法

for loop method for finding non-sequential slots (holes) in an array

正如标题所说 - 我正在尝试使用 for-loop 查找数组中的第一个空(缺失)数字(空洞),如果数组是连续的,例如从 1 到 7,我需要最后一个数组项之后的下一个整数,在本例中为 8.

每次整个迭代只需要一个孔返回找到的值。

当涉及到第一个条件(数组以大于 1 的值开始)时,我的逻辑是正确的,但是从下一个条件到最后一个条件总是被拾取。

简而言之:

const numbers = [1, 2, 3, 4, 6, 7];

document.getElementById("demo").innerHTML = numbers;
let hole;

holeFinder()

function holeFinder() {
  for (let i = 0; i < numbers.length; i++) {
    if (numbers[0] > 1) {
      /*  console.log(numbers[0]) */
      hole = 1;
      document.getElementById("demo").innerHTML += "<br>1: hole: " + hole;
      return hole;
    }

    if (numbers[i] > 1) {
      if ((numbers[i] - numbers[i - 1]) > 1) {
        hole = (numbers[i - 1] + 1)
        document.getElementById("demo").innerHTML += "<br>2: hole: " + hole;
        return hole;
      }

      if ((numbers[i] - numbers[i - 1]) == 1) {
        hole = numbers[numbers.length - 1] + 1;
        document.getElementById("demo").innerHTML += "<br>3: hole: " + hole;
        return hole;
      }
    }
  }
}
<h2>for loop method for finding non-sequential slots (holes) in an array</h2>
<p id="demo"></p>

JSFIDDLE

我的逻辑有什么问题?

你可以这样做

const arr1 = [1, 2, 3, 4, 6, 7]
const arr2 = [1, 2, 4, 5, 6, 7]
const arr3 = [1, 2, 3, 4, 5, 6, 7]


const findHole = arr => {
 for(let i = 0; i < arr.length; i++){
  if(arr[i] !== i + 1){
    return i + 1
  }
 }
 return arr.length + 1
}

console.log(findHole(arr1))
console.log(findHole(arr2))
console.log(findHole(arr3))

你输入第二个if语句的第二部分

if ((numbers[i] - numbers[i - 1]) == 1) {
    hole = numbers[numbers.length - 1] + 1;
    document.getElementById("demo").innerHTML += "<br>3: hole: " + hole;
    return hole;
}

在循环的第二次迭代中,所以只要你没有在第一个索引处找到洞,它总是return最后一个数组元素增加一个。您应该仅在数组的最后一个元素处检查此条件。

您也可以使用 while 循环并找到缺失的数字来打破循环。

const one = [2, 3, 4, 5, 6, 7];
const two = [1, 2, 3, 4, 6, 7];
const three = [1, 2, 3, 4, 5, 6, 7];

function findHole(numbers) {
  let count = 0;
  let hole = null;

  while (!hole) {
    count++
    const number = count;
    
    // if the array does not contain number, assign the number
    // as the missing hole number
    if (!numbers.includes(number)) {
      hole = number;
    }
  }

  return hole;
}

document.getElementById("demo").innerHTML += "1: hole: " + findHole(one) + '<br>';
document.getElementById("demo").innerHTML += "2: hole: " + findHole(two) + '<br>';
document.getElementById("demo").innerHTML += "3: hole: " + findHole(three) + '<br>';
<div id="demo"></div>