在没有 'reverse' 的情况下反转数组或复制数组

Reversing an array without 'reverse' or duplicating an array

我正在尝试解决以下练习:

Reverse an array without using the reverse method, without using a second array, and without duplicating any of the values.

我考虑过将数组设为对象,然后从头到尾更新数组,但我认为您也可以只更新它。

尝试了一些简单的方法,例如:

function reverseArray(array) {
  for (var i = 0; i < array.length; i++) {
    // var elem = array.shift();
    var elem = array.shift()
    array.push(elem)
  }
  return array
}

array = ['a', 'b','c','d','e'];

reverseArray(array);

但这并没有真正改变它。关于如何执行此操作的任何建议或解释?

以下将在不使用 reverse 方法的情况下反转数组。它的工作原理是交换第一个和最后一个元素,然后是第二个和倒数第二个元素,然后是第三个和倒数第三个元素,依此类推,直到 i 不再小于 (<) 比 j.

function reverse(arr) {
  for(var i = 0, j = arr.length-1; i < j; i++, j--) {
    var tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
  }
  return arr;
};

var reversed = reverse(['a','b','c','d','e']);
console.log(reversed);

https://jsfiddle.net/pa2fqa8n/1/

a = ['a', 'b', 'c', 'd', 'e'];
for(var i = 0; i < a.length-1; i++){
  for(var j = 0; j < a.length-i-1; j++){
    var k = a[j];
    a[j] = a[j+1];
    a[j+1] = k;
  }
}

内循环的第一次迭代将第一个元素移动到末尾,其余元素向前移动一次。接下来的每次迭代都做同样的事情,但比上一次迭代少 1。

以下是如何在没有副本、临时数组或变量的情况下保存值,或使用 Array.reverse()。就地修改数组

function reverseArray(array) {
  var len = array.length;
  for (var i=len,j=-1; j++,i--;)  array.unshift( array[len-1-i+(j)] );
  array.length = len;
}

var array = ['a', 'b','c','d','e'];

reverseArray(array);
console.log(array);

它将值向后插入到数组的开头,将旧值推到末尾,然后在迭代完成后通过重置数组长度将它们切片。

我必须使用交换变量,这是否违反了 "without duplicating any of the values"?

var test1 = [2, '5', 6, 'a', 'Z'];
var test2 = [2, '5', false, 'a', 'Z', {a: 'whatevs'}];

console.log('test1 before', JSON.stringify(test1));
console.log('test2 before', JSON.stringify(test2));

reversarooni(test1);
reversarooni(test2);

console.log('test1 after', JSON.stringify(test1));
console.log('test2 after', JSON.stringify(test2));

function reversarooni(inputArray) {
  var index = 0;
  var len = inputArray.length;
  
  for(; index < len / 2; index++) {
    var swap = inputArray[index];
    inputArray[index] = inputArray[(len - 1) - index];
    inputArray[(len - 1) - index] = swap;
  }
}

array = ['a', 'b', 'c', 'd', 'e'];
console.log(array);

for (var i = 0; i < Math.floor(array.length / 2); i++) {
  var item = array[i];
  array[i] = array[array.length - i - 1];
  array[array.length - i - 1] = item;
}
console.log(array);

这是一个最小的方法。给定 var arr = [1,2,3,4],此循环会将 arr 变异为 [4,3,2,1]

for (var i = 0; i < arr.length - 1; i++) {
    arr.splice(i, 0, arr.pop());
}

使用 ES6 语法,您不需要将值复制到临时变量中(这是最后一个要求吗?)。

function reverse(arr) {
    for(let i = 0, j = arr.length-1; i < j; i++, j--)
        [arr[i], arr[j]] = [arr[j], arr[i]];
}

const arr = ['a','b','c','d','e'];
reverse(arr);
console.log(arr);

有人可能会争辩说数组是在这里创建的(如果引擎不优化它),就像 splice 也创建一个数组(作为它的 return 值)。

您可以使用 spread syntax ..., rest parameters ... 和 return 具有递归和函数方法的交换项。

const
    _ = (...a) => a,
    rev = (a, ...rest) => rest.length ? _(...rev(...rest), a) : _(a),
    reverseArray = array => rev(...array);

console.log(reverseArray(['a', 'b', 'c', 'd', 'e']));
console.log(reverseArray(['a']));
console.log(reverseArray(['a', 'b']));
.as-console-wrapper { max-height: 100% !important; top: 0; }

function printReverse(array) {
  for (i = array.length-1; i > -1; i--) {
    console.log(array[i]); //4,3,2,1
  }
}

printReverse([1, 2, 3, 4]);

这对我有用。

function reverseArray(a) {

    const halfLength = a.length / 2;
for (let i = 0; i< halfLength; i++){
const start = a[i]
a[i] = a[a.length-i-1]
a[a.length-i-1] = start
}
   

return a;
}