Специальный массив: Массив является специальным, если каждый четный индекс содержит четное число, а каждый нечетный индекс содержит нечетное число.

#javascript #arrays #loops #logical-operators

Вопрос:

в чем проблема этого кода? это показывает ложь. это должно быть правдой.

 function isSpecialArray(arr) {
    for(i=0; i<arr.length; i  ){
        
        return ((arr[i % 2 == 0]) % 2 == 0) amp;amp; ((arr[i % 2 !==0]) % 2 !== 0)
    }   
}

console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3])) // false??
 

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

1. Ваше return утверждение в for цикле означает, что ваша функция вернется после изучения только первого элемента массива; return немедленно завершает работу функции.

2. Есть какие-либо предложения , чтобы сделать цикл достойным изучения каждого элемента, кроме каждого метода массива ?

3. Используйте if и return false для недопустимой записи в цикле. После петли return true .

4. Вы можете сделать это в одной строке и сэкономить ненужные циклы, если используете Array.prototype.every() : function isSpecial(arr) { return arr.every((item, index) => item % 2 === index % 2); }

Ответ №1:

Вы можете упростить свой код и избежать ненужных циклов, как только будет найден первый элемент, нарушающий правило.

Использование for цикла

 function isSpecial(arr) {
  for (let i = 0; i < arr.length; i  ) {
    if (arr[i] % 2 !== i % 2) return false
  }
  return true;
}
 

С помощью Array.prototype.every

 function isSpecial(arr) {
  return arr.every((item, index) => item % 2 === index % 2);
}
 

Ответ №2:

Ваш return ((arr[i % 2 == 0]) % 2 == 0) amp;amp; ((arr[i % 2 !==0]) % 2 !== 0) синтаксис неверен. Надеюсь, что приведенная ниже функция соответствует вашим требованиям.

Логические

  • Пройдитесь по массиву, проверьте каждый узел на наличие «особого» состояния и сохраните его в isNodeSpecial
  • «специальное» условие означает, что четный индекс имеет четное число, а нечетный индекс имеет нечетное число.
  • Инициализируйте переменную вне цикла, которая содержит isSpecial статус массива.
  • Обновите значение isSpecial, изменяемое как логическое и isSpecial и isNodeSpecial .
  • Всякий раз, когда один узел нарушает условие isSpecial , устанавливается значение false, и цикл завершается.
 function isSpecialArray(arr) {
  let isSpecial = true;
  for (i = 0; i < arr.length amp;amp; isSpecial; i  ) {
    const isNodeSpecial = (i % 2 === 0) ? arr[i] % 2 === 0 : arr[i] % 2 === 1;
    isSpecial = isSpecial amp;amp; isNodeSpecial;
  }
  return isSpecial;
}

console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3])); // true
console.log(isSpecialArray([2, 7, 4, 10, 6, 1, 6, 3]));// false 

Ответ №3:

Вы можете проверить, не удовлетворяет ли какой-либо элемент условию, и немедленно вернуться false . Если все элементы удовлетворяют условию, то возвращайтесь true . Это лучшее решение, когда дело доходит до производительности. Вы можете изменить свой код следующим образом:

 function isSpecialArray(arr) {
  for (i = 0; i < arr.length; i  ) {
    if (arr[i] % 2 !== i % 2) return false;
  }
  return true;
}

console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3])) //true
console.log(isSpecialArray([1, 7, 4, 9, 6, 1, 6, 3])) //false 

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

1. Почему это чрезмерно сложное состояние в if ? if (i % 2 !== arr[i] % 2) return false

2. Вы совершенно правы, позвольте мне упростить это. Tnx.

Ответ №4:

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

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

Спасибо

Ответ №5:

 arr[i % 2 == 0] //returns undefined, b/c you are trying to do arr[true]
undefined % 2 //returns NaN
NaN == 0 //returns false, so you always get false
 

Также верно и то, что другие говорят о том, что цикл сразу же обрывается, но это не главная проблема.

Попробуйте это вместо этого:

 function isSpecial(element, index) {
    if(index%2 == 0) {
        return element%2 == 0
    }
    else {
        return element%2 != 0
    }
}
function isSpecialArray(arr) {
    return arr.every(isSpecial);
}

console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3])) // true
console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 4])) // false
 

Ответ №6:

просто сделайте прямой путь :

 const isSpecialArray = arr => arr.every((v,i)=>i%2===v%2)

console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3])) // true
console.log(isSpecialArray([1, 7, 4, 9, 6, 1, 6, 3])) // false 

та же идея с array.reduce():

 const isSpecialArray = arr =>
  arr.reduce((r,v,i)=>r amp;amp; ((i%2) === (v%2)), true)

console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3]))
console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 4])) 

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

1. Могу я спросить вас , есть ли какая-то особая причина, по которой вы предлагаете reduce() закончить every() , пожалуйста? Мне в этом случае reduce() кажется менее интуитивным и читаемым. Заранее благодарю вас за ваш ответ. 🙂

2. @secan нет, вы не найдете для этого никакой «особой» причины. И есть ли у вас особая причина просить меня обосновать ответ, который вам явно не нравится?

3. Мне не нравится ваш ответ; Мне просто было интересно, была ли для этого какая-то особая причина (например, производительность), поэтому я спросил. Я самоучка и довольно посредственный разработчик, без формального образования в области CS и большого количества пробелов в знаниях-особенно в том, что касается более теоретических тем, — поэтому, когда я вижу, что более опытный разработчик предлагает решение, о причине которого я не могу догадаться, я спрашиваю в надежде лучше понять и, возможно, чему-то научиться. Я не хотел критиковать или принижать вас, и я прошу прощения, если я произвел такое впечатление (английский не мой родной язык).

4. @secan : ранг : 48