Voroba1996
@Voroba1996
JS разработчик

Задачка на массивы и циклы JS?

623f28cae5376969829588.png

Всем доброго времени суток!
Есть задача (фото сверху) и есть решение которое придумал я (код снизу)
Дайте пожалуйста обратную связь - на сколько это решение уместно.. Оно работает, но хотелось бы знать что можно улучшить или оптимизировать, или возможно можно обойтись вообще одним циклом?

Речь идёт о второй части задачи, где нужно изменить сам массив, а не возвращая новый массив.

Всем заранее спасибо за конструктивизм в ответах!)

function reverseArrayInPlace(array){
    let tempArray = []                  // Временный массив
    let length = array.length           // Длина массива (выведена в отдельную переменную для корректной работы for)
    for(let i = 0; i < length; i++){
        tempArray.push(array.pop())
    }
    for(let i = 0; i < length; i++){
        array.push(tempArray[i])
    }
}

const array = [0, 1, 2, 3, 4, 5, 'any string', true, 1.3]
reverseArrayInPlace(array)
  • Вопрос задан
  • 231 просмотр
Решения вопроса 3
sergiks
@sergiks Куратор тега JavaScript
♬♬
Лучше, наверное, без временного массива, по-честному in-place:
берёшь пару элементов и меняешь их местами.
  • Первый с последним.
  • Второй с предпоследним.
  • ?????
  • Profit!
В цикле придётся пройти всего пол-массива.
синтакс

Современный синтакс позволяет менять местами два элемента без временной переменной:
// a и b взаимно обменялись значениями:
[ a, b ] = [ b, a ];


const arr = [1, 2, 3, 4, 5];
[arr[0], arr[4]] = [arr[4], arr[0]];
arr // [5, 2, 3, 4, 1]

Ответ написан
@wonderingpeanut
Текущая имплементация имеет пространственную и временную сложность (time/space complexity) О(n). Можно улучшить space complexity до О(1): изменить массив in place - без создания временного массива.
Можно сделать одним циклом. Подумай как можно получить элемент с другого конца массива, имея значение текущего индекса элемента.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const reverseArray = (arr) =>
  arr.reduceRight((acc, item) => (acc.push(item), acc), []);

const reverseArrayInPlace = (arr) => {
  for (let i = 0, j = arr.length - 1; i < j; i += 1, j -= 1) {
    [arr[i], arr[j]] = [arr[j], arr[i]];
  }
};
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@kim_saakyan
function reverseArray(arr) {

  let j = arr.length - 1;
  for (let i = 0; i < arr.length / 2; i++) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    j--;
  }
  return arr;
}
Ответ написан
Комментировать
@lomeat
абстрактный ленивый прокрастинатор
const reverse = arr => arr.map((_, i) => arr[arr.length - (i + 1)]);

console.log(reverse([1, 2, 3, 4]))

// либо

Array.prototype.newReverse = function() {
  return this.map((_, i) => this[this.length - (i + 1)])
}

console.log([1, 2, 3, 4].newReverse())
Ответ написан
Voroba1996
@Voroba1996 Автор вопроса
JS разработчик
На хабре случайно наткнулся на комментарий с хорошим решением! Кому интересно..
function reverseArrayInPlace(array){
    for( let i = 0; i < array.length; i++ ){
        array.splice(i, 0, array.pop())
    }
}


Как по мне, то это оч
элегантно)

ссылка на комментарий: https://habr.com/ru/post/240813/#comment_8075865
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы