这是剑指offer中数组类知识点中第3道题目,此题目的难度为两颗星,相对比较简单,原题目链接:构建乘积数组。
为方便直接查看,先抄一下题目。
题目描述:
给定一个数组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]=A[1]*A[2]*...*A[n-1],B[n-1]=A[0]*A[1]*...*A[n-2])
题目分析:
有题目可知数组A与数组B是同维的,且长度也相同。其中数组A已知,求数组B。
数组B中各元素是数组A中所有元素的乘积(数组A中对应位置的元素除外)。
由于题目要求不能使用除法,所以我们不能使用(直接算出数组A中所有元素的乘积,然后再除以该位置的元素;最后得到数组B中的一个元素。)这种方法。
那么就只能逐个求数组B中的元素了。由于B[i]是A中除A[i]之外,其余元素的乘积,那么只要其余元素有0,则B[i]就必然是0。
再进一步,如果数组A中有两个或两个以上0元素,则数组B必须是全0元素。
既然考虑到了0元素,那么当A[i]=0时,数组B是什么情况呢?显然,只有B[i]不为0,其余都为0。
当数组A中没有0元素时,只能逐个按照公式来求B[i]了。
实现代码如下:
1 public int[] multiply(int[] A) { 2 if(A==null || A.length <= 0){ 3 return null; 4 } 5 int[] B = new int[A.length]; 6 int zero_num = 0; //记录数组A中0元素的个数 7 for(int i=0; i<A.length; i++){ 8 if(A[i] == 0){ 9 zero_num++; 10 if(zero_num>1){ //若数组A中0元素个数超过1个,则数组B必全为0元素 11 return B; 12 } 13 B[i]=1; 14 for(int j=0; j<A.length; j++){ 15 if(j!=i){ 16 B[i]*=A[j]; 17 } 18 } 19 return B; //若数组A中只有一个0元素,则数组B仅此位置不为0 20 }else{ //若始终无0元素,则逐个计算B[i] 21 B[i]=1; 22 for(int j=0; j<A.length; j++){ 23 if(j!=i){ 24 B[i]*=A[j]; 25 } 26 } 27 } 28 } 29 return B; 30 }
此代码在牛客网上运行时间为15ms。
原文:https://www.cnblogs.com/shengguilv/p/12858972.html