【问题标题】:How can I find all first indexes of sequence of consecutive zeroes in an array?如何找到数组中连续零序列的所有第一个索引?
【发布时间】:2020-12-17 12:46:04
【问题描述】:

我正在尝试将指向数组A 中连续0 序列开头的所有第一个索引推入新数组arrvar C 确定序列中 0 的数量。例如,如果C2,则算法将查找00,如果C3,它将查找000,以此类推。 N 是数组 A 的长度。该算法似乎有效,但由于某种原因,新数组 arr 中的值重复

var A = [1, 0, 0, 1];
var N = 4;
var C = 1;

function S(A, N, C) {
  var arr = [];
  for (var i = 0; i < N; i++) {
    for (var j = 0; j <= C; j++) {
      if ((A[i] == 0) && (A[i + j] == 0)) {
        arr.push(i);
      }
    }
  }
  console.log(arr);
  return -1;
}

/// console result:
Array(5)
0: 1
1: 1
2: 2
3: 2

//Expected:
0: 1
1: 2


【问题讨论】:

  • BC 变量有什么用?
  • 你怎么打电话给S()
  • indexes whose values equal to 0 你的术语在这部分是关闭的。 “索引”是有效负载的指针位置,因此始终是唯一的。 “有效负载”当然不必是唯一的。
  • 我不清楚人们认为他们如何回答这个问题,因为完全不清楚预期的结果是什么。为什么甚至需要两个循环?是一维数组。
  • 同意@Pointy,你的预期结果和解释是什么,Настя Кондрашина?

标签: javascript arrays push


【解决方案1】:

首先,我想建议您使用更具描述性的变量名称。您需要描述它们各自的含义这一事实意味着它们的描述性不够。

而且你的变量N 似乎是多余的,因为数组已经有一个.length 属性,你可以使用它来查看其中有多少元素。

您的错误来源似乎是您使用了嵌套循环。无需使用嵌套循环。您只需要遍历所有元素一次并跟踪重复的零。每次遇到非零值时,都会将序列计数重置为0。如果 do 遇到零,则增加序列计数,然后检查序列计数是否等于作为参数传递的零的数量。在这种情况下,您希望将第一个索引推送到结果数组并再次将序列计数重置为0

function getFirstIndexesOfSequenceOfConsecutiveZeroes(input, numberOfRepeatedZeroes) {
  if (numberOfRepeatedZeroes <= 0) {
    throw new Error("numberOfRepeatedZeroes need to be 1 or higher");
  }

  var firstIndexes = [];

  let sequenceStartIndex;
  let sequenceCount = 0;
  for (var i = 0; i < input.length; i++) {
    if (input[i] !== 0) {
      sequenceCount = 0;
    } else {
      if (sequenceCount == 0) {
        sequenceStartIndex = i;
      }

      sequenceCount++;
    }

    if (sequenceCount === numberOfRepeatedZeroes) {
      firstIndexes.push(sequenceStartIndex);
      sequenceCount = 0;
    }
  }

  return firstIndexes;
}

let input = [1, 0, 0, 1];
let numberOfRepeatedZeroes = 1;

console.log(getFirstIndexesOfSequenceOfConsecutiveZeroes(input, numberOfRepeatedZeroes));

【讨论】:

    【解决方案2】:

    试试:

    function S(A, B, C) {
    
     var arr = [];
      for (var i = 0; i < B; i++) {
        for (var j = 0; j <= C; j++) {
          if ((A[i] == 0) && (A[i + j] == 0) && !arr.includes(i)) {
            arr.push(i);
          }
        }
      }
      console.log(arr);
      return -1;
    }
    

    通过 if 中的这个简单添加,您可以检查该值是否已经在您的数组中。

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2018-08-27
      • 2020-04-09
      • 2021-10-27
      相关资源
      最近更新 更多