@kirillleogky

Почему не работает сортировка массива?

Ката - https://www.codewars.com/kata/5bd776533a7e2720c400...


Почему данный вариант не проходит последнюю проверку:
function pendulum(values) {
    let sortArray = values.sort((a, b) => a - b);
    let firstArray = [];
    let secondArray = [];
    for(let i = 0;  i < sortArray.length; i+=2) {
      let nextIndex = i + 1;
        if (sortArray[i]) {
            firstArray.push(sortArray[i]);
        }
        if (sortArray[nextIndex]) {
            secondArray.push(sortArray[nextIndex]);
        }
    }
    return firstArray.reverse().concat(secondArray); // Do your magic!
}

Я думаю это из-за увеличения на 2 (for(let i = 0; i < sortArray.length; i+=2))
Но почему не проходит понять не могу


А данный вариант работает прекрасно:
function pendulum(values) {
    let sortArray = values.sort((a, b) => a - b);
    let firstArray = [];
    let secondArray = [];
    for(let i = 0;  i < sortArray.length; i++) {
        if (i % 2 === 0)  {
            firstArray.push(sortArray[i]);
        } else {
            secondArray.push(sortArray[i]);
        }
    }
  
    return firstArray.reverse().concat(secondArray); // Do your magic!
}
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Вы не понимаете,...

  • ...как работают условные операторы:

    if (sortArray[i]) {

    Что если там 0? Тогда этот элемент обработан не будет - не попадёт в результирующий массив. О чём, кстати, и говорится в сообщении об ошибке, в возвращаемом вами отсортированном массиве элементов меньше, чем в исходном:

    expected [ Array(14980) ] to deeply equal [ Array(15000) ]

  • ...когда условные операторы следует применять - первый не нужен, элемент с индексом i всегда существует, так что засовывать в firstArray его следует без проверок.
  • ...как, имея индекс, проверить наличие соответствующего элемента в массиве.

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

function pendulum(arr) {
  arr.sort((a, b) => a - b);

  const head = [];
  const tail = [];

  for (let i = 0; i < arr.length; i += 2) {
    head.push(arr[i]);

    if (i + 1 < arr.length) { // или if (arr.hasOwnProperty(i + 1)) {
      tail.push(arr[i + 1]);
    }
  }

  return [ ...head.reverse(), ...tail ];
}


А вообще, не надо тут никаких if'ов.
const pendulum = arr => arr
  .sort((a, b) => a - b)
  .reduce((acc, n, i) => (acc[i & 1].push(n), acc), [ [], [] ])
  .flatMap((n, i) => i ? n : n.reverse());
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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