@Raym0NT

Как найти четное число в массиве из нечетных чисел и наоборот?

Решаю задачу на codewars.

Мой код:

function findOutlier(integers){
  let even; //  10 / 2 = 0;
  let odd; //  11 / 2 = 1
  let arraySum = (integers) =>  integers.reduce((acc, num) => acc + num, 0);
  let numReturn;
  
  let arrayIndex = 0;
  if ((arraySum(integers) % 2) == 0) {
    // if 1 / means there is one odd number in the array
    integers.forEach(num => {
      even = num % 2;
      if (even < 0.5){ 
        numReturn = integers[arrayIndex];
      }
     ++arrayIndex;
    })
  } else{
    // if 0 / means there is one even number in the array
    integers.forEach(num => {
      even = num % 2;
      if (even > 0.5){ 
         numReturn = integers[arrayIndex];
      } 
     ++arrayIndex;
    })
  }
   return numReturn
    
  
  /* 
    In order to find in which array an even / odd number,
    we get the sum of the array and % gives us the answer 0/1 | Even Odd
  */

}

Результат:
6222330823cfc563821336.png

Один основной вопрос - как можно это решить, мне нужен не сам ответ, а то какими способами это возможно решить, я пробовал найти сумму всего массива и получить остаток и если остаток 1/0, то это нечетное/четное, это необходимо, чтобы понять в массиве есть нечетное число или четное число и дальше в зависимости от того, какое число в самом массиве я вычислял его с помощью forEach и добавлял i++ дабы получить индекс самого числа, которое является лишним, но это работает только на простых числах, а если смотреть более сложные тесты в codewars, то там такое не прокатит - какой вариант решения/формулу/технологии использовали бы вы для того чтобы найти в массиве где все четные одно не четное число и наоборот?
  • Вопрос задан
  • 1523 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
мне нужен не сам ответ

Тогда не открывайте спойлер.

Варианты разные есть.

Нормальный:

function findOutlier(integers) {
  const [ p0, p1, p2 ] = integers.slice(0, 3).map(n => n & 1);
  return p0 === p1
    ? integers.find(n => (n & 1) !== p0)
    : integers[+(p0 === p2)];
}

Козлиный:

const findOutlier = arr => arr
  .reduce((acc, n) => (acc[n & 1].push(n), acc), [ [], [] ])
  .find(n => n.length === 1)
  .pop();

Суперкозлиный:

const findOutlier = arr => arr
  .sort((a, b) => (a & 1) - (b & 1))
  .at(-((arr[0] & 1) === (arr[1] & 1)));


Посмотрите чётность первых трёх чисел. У двух или трёх она совпадёт. Запоминаете это совпавшее значение и перебираете массив в поисках элемента с противоположной чётностью.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы