计算向量 int[] 中“1”位置之间的“0”位置总数

Calculation of a total number of "0" positions between "1" positions in a vector int[]

有一个1和0的向量:

int[] vec = new int[6]{0,1,0,0,1,0};

我需要计算“1”位置之间的“0”位置总数。例如,如果 <0,1,0,0,1,0> 那么答案是 2。但是,问题是向量可能包含以下值:

int[] vec = new int[6]{0,1,0,0,0,0};  // the answer is 0

int[] vec = new int[6]{1,0,0,1,0,1};  / the answer is 3

到目前为止,我只是针对第一种情况(<0,1,0,0,1,0>)做了一个简单的算法。

    int start = 0, end = 0;
    for (int i=0; i<vec.length; i++)
    {
        if (vec[i] == 1 && start == 0)
            start = i;

        if (vec[i] == 1 && start != 0)
            end = i;
    }
    int result = end - start - 1;

我需要一些帮助来开发可以处理所有上述情况的更通用的算法。

您可以从两端遍历数组以找到第一个和最后一个 1。然后,如果你找到了两者,数一数它们之间的 0s。

int start = -1;
int end = vec.length;
int i = 0;
int j = vec.length-1;
while (i < j) {
    if (vec[i] == 1 && start < 0)
        start = i;
    i++;
    if (vec[j] == 1 && end >= vec.length)
        end = j;
    j--;
    if (start >= 0 && end < vec.length)
        break;
} 
int count = 0;
if (start >= 0 && end < vec.length) {
    for (i = start + 1; i < end; i++) {
        if (vec[i] == 0)
            count++;
    }
}

大概可以优化成一个循环

抱歉,最初我以为您想计算段数而不是实际的零数。

您可以计算第一个零 (n) 之后的所有零,跟踪自最后一个 (m) 以来零的数量。然后,当您到达向量的末尾时,n 的计数是 m 个零,太高了。

int count = 0;
int zeroesSinceLastOne = 0;
bool firstOneSeen = false;

for(int i = 0, n = vector.size(); i < n; ++i)
{
    while(!firstOneSeen && vector[i] == 0)
    {
        continue;
    }
    firstOneSeen = true;

    if(vector[i] == 0)
    {
        ++count; 
        ++zeroesSinceLastOne;
    }
    else
    {
        zeroesSinceLast = 0;
    }
}

return count - zeroesSinceLastOnce;

免责声明:未经测试。可能会给出错误的数字或杀死你的猫。

试试这个算法:

startIndex = -1;
endIndex = -1;
for i from 1 to vec.length():
   if( 1 == vec[i])
       startIndex = i
       break;
for i from vec.length() to 1:
   if( 1 == vec[i])
       endIndex = i
       break;
ans = endIndex - startIndex - no_of_ones_in_between