0

我必须用 Java 编写一个使用分而治之技术的算法。给定一个包含 n 个 int 元素的数组 V,算法应该计算两个连续 0 出现的次数。

示例:如果V = [3, 0, 0, 1, 0, 1, 3, 2, 0, 0, 0, 1, 2],则算法应返回 3,注意 0、0、0 对应于具有 2 对连续零。

我已经编写了如下程序,但是当我运行它时,它给了我一个ArrayIndexOutOfBoundsException. 我究竟做错了什么 ?

public class Test {
    public static void main(String[] args){
        int[] v = {3, 0, 0, 1, 0, 1, 3, 2, 0, 0, 0, 1, 2};
        System.out.println(Conta_Zeri_Main(v));
    }

    public static int Conta_Zeri_Main(int[] v){
        if (v.length == 0 || v.length == 1)
            return 0;
        else  
            return Conta_Zeri(v, 1, v.length);
    }

    public static int Conta_Zeri(int[] v, int i, int f){
        int m,result,sx,dx;
        if (i >= f)
            return 0;
        else{
            m = (i + f)/2;
            sx = Conta_Zeri(v, i, m);
            dx = Conta_Zeri(v, m+1, f);
            result = sx + dx;
            if ((v[m] == v[m+1]) && (v[m] == 0))
                result++;

            return result; 
        }

    }

}
4

1 回答 1

1

除了已经指出的异常,

在您的代码中,您不检查 if v[m] = v[m+1] = 0。当数组在 2 个连续的零之间进行分区时,这将错过一些可能性。

将您的 if 语句更改为:

if ( (m < v.length - 1 ) && (v[m] == v[m+1]) && (v[m] == 0) ) 
于 2013-11-09T14:36:02.860 回答