有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

排序我尝试合并两个排序的数组,但得到的是java。lang.ArrayIndexOutofBounds异常:5无法找出原因

即使我在递增之前检查了j和k的值,它也超出了第一个if语句的界限

`int[] Merge(int[]a,int[]b){
int n=a.length+b.length;
int[] sol= new int[n];
int i=0,j=0,k=0;

while(i<n){

if(a[j]<b[k]){

    sol[i]=a[j];

    if(j<a.length)j++;
}
else if(b[k]<a[j]){

        sol[i]=b[k];

        if(k<b.length)k++;

}

i++;

}


return sol;

}`

我不明白数组在哪里越界了


共 (2) 个答案

  1. # 1 楼答案

    考虑当j=A.thth-1或k= b长度-1时,如果IF条件[^ {};或^ {CD2>} ]通过,使j==a长度变为true或k==b长度为true,while循环在抛出ARARYEXTEXOUTFOUD异常时再次访问该数组。此外,您的代码不处理数组中的公共元素。请检查下面的正确代码

    int[] Merge(int[]a,int[]b){
    int n=a.length+b.length;
            int[] sol= new int[n];
            int i=0,j=0,k=0;
    
            while(i<n){
                if(a[j]<=b[k]){ // equality check handles common case
    
                    sol[i++]=a[j++];
                    if(j==a.length)
                       break;
    
                }
                else if(b[k]<a[j]){
                    sol[i++]=b[k++];
                    if(k==b.length)
                        break ;
    
                }
    
    
            }
            if(j==a.length) {
                while (k != b.length)
                    sol[i++]=b[k++];
            }
            if(k==b.length) {
                while (j != a.length)
                    sol[i++]=a[j++];
            }
            return sol;
    }
    
  2. # 2 楼答案

    问题在于:

    if(j<a.length)j++;
    

    这里,当j=a.length-1时,由于j++,它将变成a.length。 现在,a[j]将超出范围,因为j=a.length。长度总是不允许的。索引从0开始,所以最后一个索引是a.length-1