【问题标题】:iterate over "looped" array遍历“循环”数组
【发布时间】:2019-11-14 03:51:40
【问题描述】:

假设我有一个这样的数组:

let arr = [1,2,3....36,38,39]; //an array of 39 elements

标题中的'looped'是指向前遍历数组时,迭代从arr[39]跳转到arr[0],同样从arr[0]跳转到arr[39]也是如此——在本质上,数组是一个闭环。

在我的代码中,我交替迭代迭代的方向,并且每个此类步进的开始和结束索引都是预先确定的:

arr[0] //initial condition is always the same
arr[5]
arr[17]
arr[30]
arr[14]
etc.

我的问题是这样的——考虑到 arr[39] 和 arr[0] 之间的差距,是否有一种简单的方法可以确定哪种迭代方式“更短”?

也就是说,当迭代在 arr[35] 并且下一条指令是转到 arr[2] 时,它更接近通过“间隙”采取 6 步,而不是向后走 33 步。

【问题讨论】:

  • 是的,简单的模数运算
  • 您是否想弄清楚“通过间隙”与“通过间隙”是否更快无论前进/后退 ?或者试图弄清楚向前向后是否更快?
  • @TylerRoper 很抱歉,如果不清楚。考虑数组是一个圆圈,第一个和最后一个索引是邻居。向前/向后方向(i++ vs i--)必须通过哪种方式更快地从一个索引到达另一个索引来确定(也就是说 - 从 37 到 2 是更快地向前和通过间隙,但从 20 到7 是向后更快而不是通过间隙)

标签: javascript arrays


【解决方案1】:

如何使用slice 方法计算两个方向的差异?它可能会很好用,因为您可以使用负数来计算“跳过间隙”时的项目数或[36] -> [35] 不一定总是转发。

function shortestPath (idx1, idx2, array) {
  const min = Math.min(idx1, idx2);
  const max = Math.max(idx1, idx2);

  const straight = array.slice(min, max).length;
  const looped = array.slice(max - array.length).length + array.slice(0, min).length;

  return (straight < looped)
    ? 'straight' : 'jump the gap';
}

const array = new Array(40);
shortestPath(2, 35, array) // 'jump the gap'
shortestPath(35, 2, array) // 'jump the gap'
shortestPath(36, 35, array) // 'straight'
shortestPath(35, 36, array) // 'straight'

如果你给它的索引超出 array.length 或负数等,我没有任何错误检查或任何东西......但这应该给你一个开始。它之所以有效,是因为slice 允许您使用负数作为开头。所以slice(-2) 说给我最后两项。这样,我们可以抓取两个索引两侧的项目,而不是抓取数组的中间,然后将它们相加。

【讨论】:

    【解决方案2】:

    给定 m 数组的大小,ij 分别是实际和下一个 index,那么:

    if(Math.abs(i - j) > Math.abs(i - (m + j))) {
        // use gap
    } else {
        // go straight
    }
    

    您可以将这个间隙想象成第二个阵列在第一个阵列之后加入。如果是这样,那么下一个索引将是m + j

    【讨论】:

      猜你喜欢
      • 2014-06-04
      • 2019-07-10
      • 1970-01-01
      • 2018-04-01
      • 2013-12-16
      • 2011-01-25
      • 2013-02-12
      相关资源
      最近更新 更多