Почему я не могу обнаружить 3 нечетных целых числа подряд в массиве?

#javascript

#javascript

Вопрос:

Я хочу проверить, содержит ли массив три нечетных целых числа последовательно (что означает их позиции в массиве, не обязательно в числовом порядке). Если есть, то возвращайте true , иначе возвращайте false .

Мой код:

 var threeConsecutiveOdds = function(arr) {
    for(var i = 0;i <arr.length;i  ){
        if(arr[i] % 2  !==0 amp;amp; arr[i 1] % 2 !==0 amp;amp; arr[i 2] % 2 !==0){
            return true;
        }else{
            return false;
        }
    }
}
  

Я хочу спросить, почему он показывает false для threeConsecutiveOdds([1, 2, 34, 3, 4, 5, 7, 23, 12])

Где он должен возвращать true, поскольку в этом массиве есть три последовательных нечетных целых числа [5,7,23] , это три последовательных коэффициента.

Комментарии:

1. return немедленно завершает работу функции. Ваш цикл никогда не будет длиться более одной итерации.

2. Потому что вы возвращаете либо true, либо false после того, как вы уже проверили первые три элемента. Ваш код никогда не продвинется дальше этого, потому что вы вернулись и, таким образом, вышли из своей функции уже в этот момент.

Ответ №1:

Ваш код проверяет только первые 3 элемента в массиве.

Вместо немедленного возврата после проверки 3 элементов, вам нужно вернуться только тогда, когда вы проверили весь массив.

Для этого поставьте return false после окончания вашего цикла, чтобы он возвращал это значение только после проверки всех возможных элементов.

Примечание. На самом деле вам не нужно проверять последние 2 элемента массива, потому что после них недостаточно чисел, чтобы последовательность была возможной.

Демонстрация, тестирование результатов true и false:

 var threeConsecutiveOdds = function(arr) {

  for (var i = 0; i < arr.length-2; i  ) {

    if (arr[i] % 2 !== 0 amp;amp; arr[i   1] % 2 !== 0 amp;amp; arr[i   2] % 2 !== 0) {
      return true;
    }
  }
  return false;
}

console.log(threeConsecutiveOdds([1, 2, 34, 3, 4, 5, 7, 23, 12]));
console.log(threeConsecutiveOdds([1, 2, 34, 3, 5, 4, 7, 23, 12]));  

Ответ №2:

Измените на это:

 for(var i = 0; i <arr.length-2; i  ) {
    if(arr[i] % 2  !==0 amp;amp; arr[i 1] % 2 !==0 amp;amp; arr[i 2] % 2 !==0){
        return true;
    }
}
return false;
  

Было две ошибки. Во-первых, вы завершали работу, как только проверяли первые три. Другой читал дальше конца массива, откуда -2 берется.

Комментарии:

1. @iAmOren Почти. Вы забыли значение по модулю для последних двух, но вы правы, что можно пропустить сравнение с нулем

2. упс… я забыл … 🙂

3. Или if(arr[i]%2 amp;amp; arr[i 1]%2 amp;amp; arr[i 2]%2) .

Ответ №3:

Оператор else не требует, вы можете просто написать return false после цикла for.

Если найдено три последовательных нечетных целых числа, возвращается значение true, если нет, то цикл завершается, а затем возвращается флаг false.

 var return_flag = function(array) {

  for (var i = 0; i < array.length-2; i  ) {

    if (array[i] % 2 !== 0 amp;amp; array[i   1] % 2 !== 0 amp;amp; array[i   2] % 2 !== 0) {
      return true;
    }
  }
  return false;
}

console.info(return_flag([1, 2, 34, 3, 4, 5, 7, 23, 12]));  

Комментарии:

1. @SuryanshSingh рад вам помочь 🙂

Ответ №4:

Немного хакерский, но интуитивно понятный для проверки трех последовательных коэффициентов.

 var threeConsecutiveOdds = (arr) => {
  return arr.map((n) => n % 2).join``.includes('111');
};

console.log(threeConsecutiveOdds([1, 2, 34, 3, 4, 5, 7, 23, 12]));  

Ответ №5:

Если вы хотите немного повеселиться, вы также можете реализовать рекурсивное решение:

 const arr1 = [1, 2, 3, 2, 5, 9, 7, 11, 6, 6, 8, 4];
const arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
const arr3 = ['foo', 7.5, 3, {}, 5, 13, 7, 8, 9, 10, 11];
const arr4 = [1,3];

function checkOddSequence(arr, sequenceLength, counter = 0) {
  /* 
  * if the odd numbers counter is equal to the sequence
  * length we want, return true
  */
  if (counter === sequenceLength) return true;

  /*
  * if the array has less elements than the sequence
  * length we want, return false
  */
  if (arr.length < sequenceLength) return false;

  if (typeof arr[0] !== 'number' || !Number.isInteger(arr[0]) || arr[0] % 2 === 0) {
    /*
    * if the first element of the array is not a number
    * or is not an integer number or it is an even numbe,
    * reset the odd numbers counter
    */
    counter = 0;
  } else {
    // otherwise increment the odd numbers counter
    counter  ;
  }

  /*
  * re-run the function, passing a copy of the array without the
  * first element
  * (passing a copy will prevent from modifying the original array)
  */
  return checkOddSequence(arr.slice(1), sequenceLength, counter);
}

console.log('arr1:', arr1.join(","),'nhas arr1 3 consecutive odd numbers?', checkOddSequence(arr1, 3));
console.log('arr2:', arr2.join(","),'nhas arr2 3 consecutive odd numbers?', checkOddSequence(arr2, 3));
console.log('arr3:', arr3.join(","),'nhas arr3 3 consecutive odd numbers?', checkOddSequence(arr3, 3));
console.log('arr4:', arr4.join(","),'nhas arr4 3 consecutive odd numbers?', checkOddSequence(arr4, 3));
console.log('arr1:', arr1.join(","),'nhas arr1 4 consecutive odd numbers?', checkOddSequence(arr1, 4));
console.log('arr1:', arr1.join(","),'nhas arr1 5 consecutive odd numbers?', checkOddSequence(arr1, 5));