如何找到数组中连续零序列的所有第一个索引?
How can I find all first indexes of sequence of consecutive zeroes in an array?
我正在尝试将指向数组 A
中一系列连续 0 的开头的所有第一个索引推送到新数组 arr
中。
var C
确定序列中 0 的数量。例如,如果 C
是 2
,算法将查找 00,如果 C
是 3
,它将查找 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
尝试:
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 中添加这个简单的代码,您可以检查该值是否已经在您的数组中。
首先我建议大家使用更具描述性的变量名。事实上,您需要描述它们各自的含义,这意味着它们的描述性不够。
您的变量 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));
我正在尝试将指向数组 A
中一系列连续 0 的开头的所有第一个索引推送到新数组 arr
中。
var C
确定序列中 0 的数量。例如,如果 C
是 2
,算法将查找 00,如果 C
是 3
,它将查找 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
尝试:
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 中添加这个简单的代码,您可以检查该值是否已经在您的数组中。
首先我建议大家使用更具描述性的变量名。事实上,您需要描述它们各自的含义,这意味着它们的描述性不够。
您的变量 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));