我想知道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右侧非零元素之间的零个数。
答案 0 :(得分:3)
检测何时发生变化(从0到非0和非0到0元素)的逻辑是有缺陷的。
您应该查看i-1
和i-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++;
这可能不是最有效的解决方案,但它是一种基于现有逻辑的方法。