接《Java中的排列组合(一)》
方法int[] delete(int[] a, int i)将数组a中下标为i的元素删除,产生一个新的数组返回。因为在方法permutation中我们要反复使用数组a,所以数组a的内容不能改变,我们这个delete方法并没有改变数组a的内容,这与它的名称有点不相符。
代码如下:
/**
* @param a 数组
* @param i 将要删除的元素的下标
* @return 数组a去除下标为i的元素之后产生的新数组
*/
public static int[] delete(int[] a, int i) {
assert a.length > 0 : "数组不能为空!";
int[] b = new int[a.length - 1]; // 初始化数组b,长度为a.length - 1
for (int j = 0, k = 0; k < a.length; k++) {
if (k == i) {
continue;
}
b[j] = a[k];
j++;
}
return b;
}
方法void matrixCopy(int[][] src, int srcRowPoc, int srcColPoc, int[][] dest, int destRowPoc, int destColPoc)从二维数组src中第srcRowPoc行第srcColPoc列开始将剩余元素复制到二维数组dest中, dest从第destRowPoc行第destColPoc列开始接收数据。
代码如下:
public static void matrixCopy(int[][] src, int srcRowPoc, int srcColPoc, int[][] dest, int destRowPoc, int destColPoc) {
for (int i = 0; srcRowPoc + i < src.length && destRowPoc + i < dest.length ; i++) {
for (int j = 0; srcColPoc + j < src[i].length && destColPoc + j < dest[j].length; j++) {
dest[destRowPoc + i][destColPoc + j] = src[srcRowPoc + i][srcColPoc + j];
}
}
}
至此,排列问题就基本解决了。下面我们再写一个方法,用来打印二维数组。
public static void printMatrix(int[][] a) {
for (int[] x : a) {
System.out.println(Arrays.toString(x));
}
}
组合的问题,明天再说。