【问题标题】:Issue trying to find length of sequence in an array尝试在数组中查找序列长度的问题
【发布时间】:2016-10-10 19:10:23
【问题描述】:

我正在尝试查找数组中序列的长度,介于指定数字的第一次和第二次出现之间。

例如:lengthOfSequence([0, -3, 7, 4, 0, 3, 7, 9], 7) 将返回 5,因为在数字 7 的 first 和 second 出现之间有 5 个索引。

我觉得我编写的代码应该可以工作,但是在控制台记录之后,看起来我的 arr.push() 方法只是将第一个索引推送到我的索引数组变量,并且它推送了两次。为什么会发生这种情况?

这是我的上下文代码:

var lengthOfSequence = function (arr, n) {

  var indexes = [];

  for (var i = 0; i < arr.length; i++) {
    if (arr[i] === n) {
      indexes.push(arr.indexOf(arr[i]));
    }
  }

  return arr.indexOf(indexes[1]) - arr.indexOf(indexes[0]);

}

因此,例如,如果我使用我之前使用的数组lengthOfSequence([0, -3, 7, 4, 0, 3, 7, 9], 7),我的 for 循环会找到第一次出现的 7(索引 2)并将其推送到我的索引数组变量,但它会这样做两次。所以我的索引数组就是[2,2]。为什么不是[2,6]?

【问题讨论】:

    标签: javascript arrays function variables methods


    【解决方案1】:

    indexOf 并没有按照你的想法去做。它返回它使用提供的值找到的 first 项的索引。对于数组中的两个值,它返回第一个索引。

    由于您只需要索引并且您已经使用循环对其进行迭代,因此您可以简单地使用 i 本身:

    indexes.push(i);
    

    【讨论】:

    • 在找到第二个时也需要中断....如果有更多相同将给出不正确的输出
    • @charlietfl:不是真的。 OP 的代码不需要中断;但它总是会返回前两次出现之间的距离。对于 2 以上,您可以使用返回数组的长度并从第一项中减去最后一项。 (从技术上讲,当只找到一个事件时它甚至会是正确的,但是当没有找到时会抛出错误。)
    • 是的..那是真的...数组只会增长,前两个元素就足够了
    • 谢谢!一定是想多了。
    【解决方案2】:

    你可以这样做,但不知道为什么你想要 5。我想应该是 4。好吧,让它变成 5。

    function lengthOfSequence(a,f){
      var fi = a.indexOf(f);
      return a.slice(fi)
              .indexOf(f)+(2*fi+1);
    }
    
    var a = [0, -3, 7, 4, 0, 3, 7, 9],
        f = 7;
    console.log(lengthOfSequence(a,f));

    【讨论】:

      【解决方案3】:

      您可以只使用索引并返回索引的最后一个元素与第一个元素加一之间的差。

      var lengthOfSequence = function(arr, n) {
          var indexes = [];
          for (var i = 0; i < arr.length; i++) {
              if (arr[i] === n) {
                indexes.push(i);
              }
          }
          return indexes[indexes.length - 1] - indexes[0] + 1;
      }
      
      console.log(lengthOfSequence([0, -3, 7, 4, 0, 3, 7, 9], 7));  // 5
      console.log(lengthOfSequence([0, -3, 7, 4, 0, 3, 7, 9], -3)); // 1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 2010-11-07
        • 2023-04-05
        • 2023-03-16
        • 1970-01-01
        相关资源
        最近更新 更多