JavaScript - обратный массив указанным способом c - PullRequest
1 голос
/ 08 января 2020

Я делаю курс по алгоритму, и вот ответ инструктора о том, как инвертировать массив без использования обратного js метода:

function solution(arr) {
  for(var i=0; i < arr.length/2; i++) {
    var tempVar = arr[i]
    arr[i] = arr[arr.length - 1 - i]
    arr[arr.length - 1 - i] = tempVar
  }

  return arr
}

Я все понял, кроме этой детали:

arr.length/2

В этой строке ниже:

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

что это значит? Какова его цель?

Ответы [ 3 ]

2 голосов
/ 08 января 2020

Чтобы перевернуть строку, вы должны поменять местами символы первой половины строки с последней половиной.

let str = 'abcde';

Вы должны поменять местами a с e, b с d.

ab - первая половина строки. Так что просто запустите l oop над первой половиной строки и поменяйте местами i th с arr.length - 1 - i th, как показано ниже

var tempVar = arr[i]
arr[i] = arr[arr.length - 1 - i]
arr[arr.length - 1 - i] = tempVar
1 голос
/ 08 января 2020

Алгоритм меняет два элемента, которые находятся на одинаковом расстоянии от обоих концов массива. Необходимое количество операций - number_of_operations = number_of_elements / number_elements_operated_on, и, поскольку он выполняет два элемента одновременно, это number_of_elements / 2. И, следовательно, причина использования arr.length / 2 в качестве ограничения for l oop. Вот представление о том, что происходит.

Учитывая массив [1, 2, 3, 4, 5, 6], тогда array.length равен 6 и выполняются следующие операции:

//loop i = 0, 0 < 3 == true, execute
[1, 2, 3, 4, 5, 6] -> [6, 2, 3, 4, 5, 1]
 ^--------------^      ^--------------^

//loop i = 1, 1 < 3 == true, execute
[6, 2, 3, 4, 5, 1] -> [6, 5, 3, 4, 2, 1]
    ^--------^            ^--------^


//loop i = 2, 2 < 3 == true, execute
[6, 5, 3, 4, 2, 1] -> [6, 5, 4, 3, 2, 1]
       ^--^                  ^--^

//i = 3, 3 < 3 == false, loop stops

Это прекрасно работает с нечетным число элементов, так как при его получении будет только один элемент посередине.

Если задан массив [1, 2, 3, 4, 5], тогда array.length равен 5, и выполняются следующие операции:

//loop i = 0, 0 < 2.5 == true, execute
[1, 2, 3, 4, 5] -> [5, 2, 3, 4, 1]
 ^-----------^      ^-----------^

//loop i = 1, 1 < 2.5 == true, execute
[5, 2, 3, 4, 1] -> [5, 4, 3, 2, 1]
    ^-----^            ^-----^


//loop i = 2, 2 < 2.5 == true, execute
[5, 2, 3, 4, 1] -> [5, 4, 3, 2, 1]
       ^                  ^

//i = 3, 3 < 2.5 == false, loop stops
1 голос
/ 08 января 2020

Алгоритм начинается с первого и последнего элемента и заменяет их. Затем он берет второй элемент с начала и с конца и меняет их местами. И т. Д. c он меняет местами все элементы с одинаковым расстоянием от центра.

Таким образом, алгоритм go к центру массива с обеих сторон. И для продолжения потребуется только половина длины массива с обеих сторон. Так что это утверждение arr.length/2 на самом деле выражение, которое является половиной длины.

, которое используется в качестве предела l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...