【问题标题】:I'm trying to merge two sorted arrays but getting java.lang.ArrayIndexOutOfBoundsException: 5 can't figure out why我正在尝试合并两个排序的数组,但得到 java.lang.ArrayIndexOutOfBoundsException: 5 无法弄清楚为什么
【发布时间】:2020-09-18 14:13:38
【问题描述】:

即使在我在递增之前检查 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;

}`

我不明白数组在哪里越界

【问题讨论】:

  • 请记住,a[a.length] 已经超出范围。有效索引从0a.length-1
  • j&lt;a.length不意味着它可以拥有的最大索引是a.length-1
  • 不,在这种情况下你仍然增加j,然后可能变成a.length,这将导致下一次外循环迭代出错。
  • 很抱歉,我不明白jif(j&lt;a.length) j++ 之后如何增加。您能详细说明一下吗?
  • 假设ja.length-1,则if条件为真,j将增加到a.length

标签: java sorting merge


【解决方案1】:

考虑 j=a.length-1 或 k=b.length-1 的情况,然后您的 if 条件 [if(j&lt;a.length)j++;或if(k&lt;b.length)k++;] 传递并使 j==a.length 为 true 或 k==b.length 为 true 并且当 while 循环抛出 ArrayIndexOutofBound 异常时再次访问该数组。此外,您的代码不处理数组中的常见元素。请检查下面的正确代码

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】:

    问题出在这里:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 2011-09-14
      相关资源
      最近更新 更多