我有两个排序的数组arr1和arr2,我试图将这两个数组合并到另一个数组'output'中。 但问题是如果第一个数组耗尽,即数组arr1被完全使用,则'i'的值将大于数组的长度,因此在下一次迭代时arr [i]给出错误。可以做些什么来避免这种情况?
int i=0;
int j=0;
for(int k=0;k<output.length;k++) {
if(arr1[i]<arr2[j]) {
output[k]=arr1[i];
i++;
}
else{
output[k]=arr2[j];
j++;
}
}
答案 0 :(得分:0)
您需要检查阵列是否已耗尽:
int i=0;
int j=0;
for(int k=0;k<output.length;k++) {
if(i < arr1.length && j < arr2.length) {
// both arrays still have unused elements
if (arr1[i]<arr2[j]) {
output[k]=arr1[i];
i++;
} else {
output[k]=arr2[j];
j++;
}
} else if (i < arr1.length) {
// only the first array has unused elements
output[k]=arr1[i];
i++;
} else if (j < arr2.length) {
// only the second array has unused elements
output[k]=arr2[j];
j++;
}
}
答案 1 :(得分:0)
我们可以利用k的值不必检查的事实,因为输出数组的长度等于arr1和arr2的长度之和。一旦任一阵列的元素耗尽,我们就退出main for循环(因此条件i&lt; arr1.length&amp;&amp; j&lt; arr2.length)。现在,由于其中一个数组已经耗尽,我们只需要将另一个数组的所有剩余元素转储到输出数组中。因此我们检查条件是否i!= arr1.length,如果为真,则表示j等于arr2.length,因此arr2已用尽,并且arr1的元素必须被转储到输出数组中。否则,我们将剩余的arr2元素转储到输出数组中。
int i=0;
int j=0;
for(int k=0;i<arr1.length && j < arr2.length ;k++) {
if(arr1[i]<arr2[j]) {
output[k]=arr1[i];
i++;
}
else{
output[k]=arr2[j];
j++;
}
}
if(i != arr1.length){
for(; i < arr1.length; i++,k++)
output[k]=arr1[i];
}
else{
for(; j < arr2.length; j++,k++)
output[k]=arr2[j];
}