复制函数边界定义错了 ,重新发
public static void main(String[] args) throws Exception {
int[] a = { 2, 5, 6, 7, 9, 12, 25 };
int[] b = { 0, 3, 4, 5, 6, 9, 11, 20 };
printArr(a);
printArr(b);
if (a[a.length - 1] > b[b.length - 1]) {
printArr(arrayCombine(a, b));
} else {
printArr(arrayCombine(b, a));
}
printArr(arrayUnion(a, b));
}
/**
* 打印数组
*
* @param arr
*/
private static void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
/**
* 两个有序不含重复元素数组合成为一个有序不重复元素数组
*
* @param arrBig
* 数组最后一个值较大
* @param arrSmall
* 数组最后一个值较小
* @return 结果数组
*/
private static int[] arrayCombine(int[] arrBig, int[] arrSmall) {
// 合成数组的最大存储空间为arrBig.length + arrSmall.length,那就定义一个这样的数组空间
int[] arr = new int[arrBig.length + arrSmall.length];
int i = 0, j = 0, k = 0;
// 因为arrBig最后一个元素更大,所以肯定是arrBig最后复制进arr数组。也就是说arrSmall的索引指针i最先到达arrSmall的最后一个元素。
// 然后两个索引值对应的数组值比较大小,小的先存入arr中,同时合成数组和取值的数组索引值自增。
// 如果相等的话,三个数组索引值都自增,但是存储进合成数组的元素只有一个
while (i != arrSmall.length) {
if (arrBig[j] > arrSmall[i]) {
arr[k++] = arrSmall[i++];
} else if (arrBig[j] < arrSmall[i]) {
arr[k++] = arrBig[j++];
} else if (arrBig[j] == arrSmall[i]) {
arr[k++] = arrBig[j++];
i++;
}
}
// 这时候arrSmall 已经遍历完了数据,而arrBig中还有一段数组数据没有遍历过,直接把这段数据存储进合成数组
int arrBigLastLength = arrBig.length - j;
arrayCopy(arr, arrBig, j, arrBigLastLength, k);
// 把arr的冗余数据去掉
return arrayCopy(arr, 0, k + arrBigLastLength);
}
/**
* 带目标数组的数组复制
*
* @param dec
* 目标数组
* @param source
* 源数组
* @param startS
* 原数组开始索引位置,包含
* @param length
* 从索引位置开始需要复制的长度值
* @param startD
* 目标数组开始的位置,包含
*/
private static void arrayCopy(int[] dec, int[] source, int startS, int length, int startD) {
for (int i = 0; i < length; i++) {
dec[i + startD] = source[i + startS];
}
}
/**
* 不带目标数组的数组复制
*
* @param source
* 源数组
* @param start
* 源数组开始索引的位置,包含
* @param length
* 从索引位置开始需要复制的长度值
* @return 生成新数组
*/
private static int[] arrayCopy(int[] source, int start, int length) {
int[] result = new int[length];
for (int i = 0; i < length; i++) {
result[i] = source[i + start];
}
return result;
} |