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

Java 如何在连续的非零元素之间找到零元素的数量,java,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

我想知道
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);
int[]f=新的int[]{0,0,3,0,0,1};
int start=0,end=0;
对于(int i=0;i=0)(结束-开始-1):(开始-结束-1);
答案是3和1之间的2个零

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

更新:
我想计算最后一个左侧非零元素和第一个右侧非零元素之间的零数。

您检测何时发生更改(从0到非0以及从非0到0元素)的逻辑有缺陷

你应该看<代码> i>代码>代码> I-1 < /Cord>元素。考虑以下内容:

  • 当元素
    i-1
    为非零且元素
    i
    为0时,开始索引应为
  • 当元素
    i-1
    为0且元素
    i
    为非0且找到开始元素时,结束索引应为(
    start>0
    ,这是为了考虑数组可以从0开始且没有开始序列这一事实)

下一个要考虑的是,数组中的非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到0元素)的逻辑存在缺陷

你应该看<代码> i>代码>代码> I-1 < /Cord>元素。考虑以下内容:

  • 当元素
    i-1
    为非零且元素
    i
    为0时,开始索引应为
  • 当元素
    i-1
    为0且元素
    i
    为非0且找到开始元素时,结束索引应为(
    start>0
    ,这是为了考虑数组可以从0开始且没有开始序列这一事实)

下一个要考虑的是,数组中的非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;
}

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

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;
}

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

您的循环行为将产生以下效果:

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;
}

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

如果您想要最后的0组,请倒计时

private static int countZeros(int[] f) {
    for (int i=f.length-1; i>=0; i--){
        if(f[i]!=0 && i>0 && f[i-1]==0){
            i--;
            int count=0;
            while(i>=0 && f[i]==0){
                i--;
                count++;
            }
            if(i==0)
                return null;
            else
                return count;
        }
    }
    return null;
}

如果您想要最后一个0组,请倒数

private static int countZeros(int[] f) {
    for (int i=f.length-1; i>=0; i--){
        if(f[i]!=0 && i>0 && f[i-1]==0){
            i--;
            int count=0;
            while(i>=0 && f[i]==0){
                i--;
                count++;
            }
            if(i==0)
                return null;
            else
                return count;
        }
    }
    return null;
}


您是否尝试过一步一步地调试代码,并检查变量以查看出了什么问题?根据定义,在#顺序#非零元素之间没有零——因为它们是顺序的。您不需要代码来解决这个问题。@assylias:我想这不是调试的问题。我只是不知道如何计算这些元素之间的零非零元素,如果非零元素的数量大于2。@山姆:谢谢,我在代码中添加了-1。将有许多序列的中间有可变数量的零。请提供您希望的输出方式?您是否尝试过一步一步地调试代码,并检查变量以查看出了什么问题?根据定义,有没有零是在#顺序#非零元素之间的——因为它们是顺序的。你不需要代码来解决这个问题。@assylias:我想这不是调试的问题。如果非零元素的数量大于2,我只是不知道如何计算非零元素之间的零。@sam:谢谢,我在代码中添加了-1。这样会有be许多序列之间有可变数量的零。请提供您想要的输出方式?为什么最后一个打印
3
?@sam前3和1之间有2个0,两个1之间有另一个0。我是否误解了什么?@sam否,因为前两个0之前没有非0元素。正如您所说,我t“在两个非零数字之间计算零的数量”哦。也许我误解了这个问题。我认为只有两个非零数字之间的零才算是零,然后打破了循环。:)+1为什么最后一个数字打印
3
?@sam前3和1之间有2个0,两个1之间有另一个0。我有什么误解吗?@sam没有,因为在前两个0之前没有非0元素。就像你说的“计算两个非零数之间的零数”哦。也许我误解了这个问题。我认为零只在两个非零之间,然后打破循环。:)+1.