如何在连续的非零元素之间找到零元素的数量

时间:2015-10-28 16:35:47

标签: java

我想知道f数组中的连续非零元素之间有多少个零。我就是这样做的:

int[] f = new int[]{0,0,3,0,0,1};
int start = 0, end = 0;
for (int i=0; i<f.length; i++)
{
    if (f[i] != 0 && start == 0)
        start=i;
    else if (f[i] != 0 && start != 0)
        end=i;
}
int cnt = (end-start-1)>=0 ? (end-start-1) : (start-end-1);

答案是3和1之间的2个零。

然而,在int[] f = new int[]{0,3,2,0,0,1}的情况下,答案是3,这是不正确的。应该是2。

更新: 我想计算LAST左侧非零元素和FIRST右侧非零元素之间的零个数。

3 个答案:

答案 0 :(得分:3)

检测何时发生变化(从0到非0和非0到0元素)的逻辑是有缺陷的。

您应该查看i-1i-1元素。请考虑以下事项:

  • 起始索引应该是元素i非零且元素i-1为0的时候。
  • 结束索引应该是当元素i为0且元素start > 0为非0并且找到了一个开始元素(private static int countZeros(int[] f) { int start = 0, end = 0, cnt = 0; for (int i = 1; i < f.length; i++) { if (f[i-1] != 0 && f[i] == 0) { start = i; } else if (f[i-1] == 0 && f[i] != 0 && start > 0) { end = i; cnt += end - start; } } return cnt; } 时,这是考虑到以下事实:数组可以从0开始,没有开始序列。)

接下来要考虑的是,在数组的非0中可能存在多个0的情况,因此每次遇到结束元素时,我们都需要将其添加到当前计数中。

将其写入代码:

System.out.println(countZeros(new int[]{0,0,3,0,0,1})); // prints 2
System.out.println(countZeros(new int[]{3,0,0,1})); // prints 2
System.out.println(countZeros(new int[]{3,0,0,1,0})); // prints 2
System.out.println(countZeros(new int[]{3,0,0,1,0,1})); // prints 3

一些例子:

{{1}}

答案 1 :(得分:2)

如果你想要最后的0s组,请向后计数。

function fn1()
{
   this.window.close();
}

function fn2()
{
  Refreshpage()//Refreshin the page logic
}

function callback()
{
   var callbacks = $.Callbacks();
   callbacks.add(fn1);
   callbacks.add(fn2);
}

答案 2 :(得分:1)

您的循环行为将产生以下影响:

for (int i=0; i<f.length; i++)
{
    if (f[i] != 0 && start == 0) //finds only first non-zero in whole array
        start=i;
    else if (f[i] != 0 && start != 0) //finds last non-zero in whole array
        end=i;
}

但是通过区分你包括范围内的所有非零和零。所以你需要一种方法来计算这些点之间的零,这很难添加到第一个循环,因为end将会改变。最简单的解决方案是第二次从start循环到end并计算零:

int cnt = 0;
for(int i=start; i<end; i++)
   if(f[i]==0)
      cnt++;

这可能不是最有效的解决方案,但它是一种基于现有逻辑的方法。