给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。
思路:先计算下三角形每一行的乘积。
B[0] = 1
B[1] = A0
B[2] = A0A1
B[3] = A0A1A2
…
B[n-1] = A0A1*A2…*An-2
代码实现如下:
B[0] = 1;
for (int i = 1; i < A.length; i++) {
B[i] = B[i - 1] * A[i - 1];
}
然后在上面步骤的基础上乘以上三角形:
B[n-2] = B[n-2] * An-1
B[n-3] = B[n-3] * An-2*An-1
…
B[1] = B1 * A2 * … * An-1
B[0] = B0 * A1 * A2 * … * An-1
代码实现如下:
int temp = 1;
for (int j = A.length - 2; j >= 0; j--) {
temp *= A[j + 1];
B[j] *= temp;
}
第二种方法,双层for循环,遇到A[i]就continue
public class Test51 {
public static int[] multiply(int[] A) {
int[] B = new int[A.length];
for (int i = 0; i < B.length; i++) {
B[i] = 1;
for (int j = 0; j < A.length; j++) {
if (j == i) {
continue;
}
B[i] *= A[j];
}
}
return B;
}
public static int[] multiply2(int[] A) {
int[] B = new int[A.length];
B[0] = 1;
for (int i = 1; i < A.length; i++) {
B[i] = B[i - 1] * A[i - 1];
}
int temp = 1;
for (int j = A.length - 2; j >= 0; j--) {
temp *= A[j + 1];
B[j] *= temp;
}
return B;
}
public static void main(String[] args) {
int[] a = new int[]{5, 1, 2, 3};
int[] b = new int[]{5, 1, 2, 3};
int[] c = multiply(a);
int[] d = multiply(b);
for (int i = 0; i < c.length; i++) {
System.out.print(c[i] + " ");
}
System.out.println();
for (int i = 0; i < c.length; i++) {
System.out.print(d[i] + " ");
}
}
}