在没有“反向”或复制数组的情况下反转数组

时间:2017-08-31 19:20:55

标签: javascript arrays algorithm array-algorithms

我正在尝试解决以下问题:

  

不使用反向方法反转数组,不使用   第二个数组,没有复制任何值。

我已经考虑过将数组作为一个对象,然后从头到尾更新数组,但我想你也可以更新它。

尝试过简单的事情:

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);

但这并没有真正改变它。关于如何做的任何建议或解释?

10 个答案:

答案 0 :(得分:6)

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

&#13;
&#13;
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);
&#13;
&#13;
&#13;

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

答案 1 :(得分:3)

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

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

&#13;
&#13;
j
&#13;
&#13;
&#13;

答案 3 :(得分:1)

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次。

答案 4 :(得分:1)

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

&#13;
&#13;
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);
&#13;
&#13;
&#13;

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

答案 5 :(得分:1)

我不得不使用交换变量,这是否违反&#34;没有重复任何值&#34;?

&#13;
&#13;
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;
  }
}
&#13;
&#13;
&#13;

答案 6 :(得分:1)

这是一种最小的方法。给定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());
}

答案 7 :(得分:0)

您可以使用spread syntax ...rest parameters ...并使用递归和功能方法返回交换的项目。

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; }

答案 8 :(得分: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]);

这对我有用。

答案 9 :(得分:0)

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;
}