首页 > 编程语言 > 详细

剑指offer——构建乘积数组

时间:2020-05-10 18:37:57      阅读:42      评论:0      收藏:0      [点我收藏+]

这是剑指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     }
View Code

 

此代码在牛客网上运行时间为15ms。

 

剑指offer——构建乘积数组

原文:https://www.cnblogs.com/shengguilv/p/12858972.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!