(EloquentJavascript:第4章)反转数组-我的版本有什么问题吗

(EloquentJavascript: Chapter 4) Reversing an array - is there anything wrong with my version?

本文关键字:版本 我的 什么 问题 数组 EloquentJavascript 4章      更新时间:2023-09-26

这是我在解决书中的"反转数组"练习时得到的。它与答案列表中的内容不同,所以我想知道我的版本是否有问题?

  function revInPlace(array){
    var tempArr = [];
    for (i=array.length; i>0; i--){
      tempArr.push(array.pop());
    }
    array = tempArr;
    return array;
  }
  var range = [1,2,3,4,5,6,7,8,9,10];
  console.log(revInPlace(range));
  --> [10,9,8,7,6,5,4,3,2,1]

书中给出的答案是:

  function reverseArrayInPlace(array) {
    for (var i = 0; i < Math.floor(array.length / 2); i++) {
      var old = array[i];
      array[i] = array[array.length - 1 - i];
      array[array.length - 1 - i] = old;
    }
    return array;
  }

由于您需要创建另一个数组,所以您没有执行相同的"就地"反转。。。

虽然书中的代码做到了这一点,但它是通过在数组的前半部分和后半部分之间切换(到位)来做到这一点的,只需尝试0和1的循环,假设一个由5个元素组成的数组:

// array = [ 1, 2, 3, 4, 5 ] ... i = 0
var old = array[i]; // array[0] is 1
array[i] = array[array.length - 1 - i]; // array[0] = array[4] which is 5
array[array.length - 1 - i] = old; // array[4] = 1

// array = [ 1, 2, 3, 4, 5 ] ... i = 1
var old = array[i]; // array[1] is 2
array[i] = array[array.length - 1 - i]; // array[1] = array[3] which is 4
array[array.length - 1 - i] = old; // array[3] = 2

长度为5的循环将在这里结束,因为Math.floor(5 / 2)是2,因为您基本上已经完成了整个数组

从技术上讲,您的版本实际上并没有在适当的位置反转数组。您创建了一个新的数组tempArr,这样在您的情况下:

reversed = revInPlace(arr);
console.log(arr); // returns empty original array after popping all elements off
console.log(reversed === arr);  // returns false;

虽然您的版本确实执行相反的操作,但由于创建新数组、弹出和推送值,速度会慢得多。

相关文章: