反向阵列到位

Sef*_*419 3 javascript arrays sorting for-loop

为什么这个功能reverseArrayInPlace不起作用?我想简单地完成函数所说的内容 - 颠倒元素的顺序,以便结果在同一个数组中结束arr.我选择在函数中使用两个数组来做到这一点.到目前为止它只是按顺序返回元素...

    var arr = ["a","b","c","d","e","f"]
    var arr2 = []

    var reverseArrayInPlace = function(array){

      var arrLength = array.length
      for (i = 0; i < arrLength; i++) {
        arr2.push(array.pop())
        array.push(arr2.shift())
      }
    }

    reverseArrayInPlace(arr)
Run Code Online (Sandbox Code Playgroud)

小智 9

这是使用就地算法反转数组的更简单方法

function reverse (array) {
  var i = 0,
      n = array.length,
      middle = Math.floor(n / 2),
      temp = null;

  for (; i < middle; i += 1) {
     temp = array[i];
     array[i] = array[n - 1 - i];
     array[n - 1 - i] = temp;
  }
}
Run Code Online (Sandbox Code Playgroud)

你将阵列"拆分"成两半.嗯,不是真的,你只是在上半场迭代.然后,使用公式找到与当前索引相对于中间的索引n - 1 - i,其中i是当前索引.然后使用临时变量交换元素.公式是正确的,因为它将交换:

0 <-> n - 1
1 <-> n - 2
Run Code Online (Sandbox Code Playgroud)

等等.如果元素的数量是奇数,则中间位置不会受到影响.


Pur*_*rag 5

pop()将删除数组的最后一个元素,push()并将一个项目附加到数组的末尾。所以你只是反复弹出和推送数组的最后一个元素。

push您可以使用splice,而不是使用,它可以让您在数组中的特定位置插入一个项目:

var reverseArrayInPlace = function (array) {
    var arrLength = array.length;
    for (i = 0; i < arrLength; i++) {
        array.splice(i, 0, array.pop());
    }
}
Run Code Online (Sandbox Code Playgroud)

(请注意,您不需要中间数组来执行此操作。使用中间数组实际上并不是就地反转。只需在当前索引处弹出和插入即可。)

另外,有趣的评论——您可以跳过最后一次迭代,因为第一个元素在length - 1迭代后总是会出现在最后一个位置。所以你可以arrLength - 1安全地迭代多次。

我还想补充一点,Javascript 有一个内置的reverse()数组方法。所以["a", "b", "c"].reverse()会屈服["c", "b", "a"]

真正的就地算法将执行交换到数组中间与另一侧的相应元素:

var reverseArrayInPlace = function (array) {
    var arrLength = array.length;
    for (var i = 0; i < arrLength/2; i++) {
        var temp = array[i];
        array[i] = array[arrLength - 1 - i];
        array[arrLength - 1 - i] = temp;
    }
}
Run Code Online (Sandbox Code Playgroud)