【问题标题】:Eloquent JavaScript reversing an array in place explanationEloquent JavaScript 就地反转数组解释
【发布时间】:2016-12-29 22:03:21
【问题描述】:

我正在完成 Marijn Haverbeke 的 Eloquent JavaScript 练习,并正在解决以下问题:

“编写一个函数 reverseArrayInPlace 来修改作为参数给出的数组以反转其元素。不要使用标准的reverse 方法”

给出的解决方案如下:

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

给出的测试用例如下:

var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]

我知道它使用数组的中点作为旋转点,但是有人可以给我一步一步的解释吗?

【问题讨论】:

标签: javascript arrays methods


【解决方案1】:
function reverseArrayInPlace(array) {
  //iterate thru half of original array
  for (var i = 0; i < Math.floor(array.length / 2); i++) {
    var old = array[i]; //cache original i value
    array[i] = array[array.length - 1 - i]; //set i value to its "opposite" from end of array
    array[array.length - 1 - i] = old; //set "opposite" to be original i value
  }
  return array;
}

当您遍历数组的 1/2 时,您交换了与数组前端和末端的距离相等的 2 个值。例如:

原始数组:[1, 2, 3, 4, 5]

步骤 i = 0:[5, 2, 3, 4, 1](交换 1 和 5)

步骤 i = 1:[5, 4, 3, 2, 1](交换 2 和 4)

【讨论】:

    【解决方案2】:

    一行一行:

    for (var i = 0; i < Math.floor(array.length / 2); i++) {
    

    将数组从 0 循环到数组的一半(四舍五入到较小的数字),每次将 i 增加一。

    var old = array[i];
    

    暂时将数组的当前值存储在变量i中的位置old中。

    array[i] = array[array.length - 1 - i];
    

    i位置的值设置为数组的最后一个元素的值减去当前i

    array[array.length - 1 - i] = old;
    

    将数组的最后一个元素的值减去当前的i 设置为前一个值(存储在old 变量中)。

    简而言之,这是实际情况中发生的情况:

    old 将存储当前循环值。该值将替换为最后一个值减去当前索引。基本上,当i0 时,array[0] 变为array[4],反之亦然。当 i 为 1 时,array[1] 将变为 array[3],反之亦然。 [array.length - 1 - i] 是必要的,因为数组中的索引从 0 开始,所以array.length - 1 是数组的最后一个元素,而-i 将偏移量移动了i,这样就可以用最后一个,反之亦然。

    那么交易在哪里而不是执行常规的 for 循环?

    好吧,诀窍是它会花费一半的时间,并且一次替换两个值,而不是循环整个数组并一次替换一个值。

    【讨论】:

      猜你喜欢
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2018-07-25
      相关资源
      最近更新 更多