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