Я изучаю JS, и у меня есть это упражнение, которое просит перевернуть массив на месте (без использования второго массива) и без использования «реверса». Хотя у меня уже есть решение для упражнения, я не понимаю, почему мое решение не работает, вот оно:
function reverseArrayInPlace (arr){
const k = arr[0];
while (arr[arr.length-1] !== k){
arr.unshift(arr.pop());
}
return arr;
}
console.info(reverseArrayInPlace(arr1));Можете ли вы привести пример как, он не работает? Как в - вход и ожидаемый результат?
вывод: [11,12,13,14,15,16,17,18,19,20,10] в моем понимании, когда цикл начинается, значение arr.pop() должно идти в начале или arr до последнего значение arr равно исходному начальному значению. Но этого не происходит



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы берете конец массива и ставите его на первую позицию:
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[1, 2, 3]
как вы можете видеть, это на самом деле ничего не меняет.
оооо, черт возьми..глупый я.. Теперь я это вижу... так что моя функция работает, но не так, как должна... большое спасибо
Это не сработает, если ваш массив содержит дубликаты первого элемента. Поскольку вы берете первый элемент в качестве ключа, всякий раз, когда любой повторяющийся элемент становится последним элементом, ваш цикл завершается.
Попробуйте это, просто проверьте, равны ли два выбранных элемента или нет, если они равны, не меняйте местами, иначе меняйте местами. Повторяйте до тех пор, пока указатель k не станет <= указателем j.
function reverseArrayInPlace (arr){
let first = 0;
let last = arr.length - 1;
let k = first, j = last;
while(k <= j){
if (arr[k] !== arr[j]){
let temp = arr[k];
arr[k] = arr[j];
arr[j] = temp;
}
k++;
j--;
}
return arr;
}
arr1 = [1, 2, 3, 4];
console.info(reverseArrayInPlace(arr1));
arr1 = [1, 2, 3];
console.info(reverseArrayInPlace(arr1));Этот метод решит проблему без pop или unshift. Попробуй это.
function reverseArray(array) {
for (let i = 0; i < Math.floor(array.length / 2); i++) {
let oldArray = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = oldArray;
}
return array;
}
console.info(reverseArray([1,2,3]));
Что, если вы попытаетесь изменить
[0, 1, 2, 0]? тогда цикл не будет работать какarr[0] === arr[arr.length - 1]...