Java构建乘积数组的方法

 更新时间:2019年03月04日 08:26:43   作者:雨幕下的稻田  
这篇文章主要为大家详细介绍了Java构建乘积数组的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Java构建乘积数组的具体实现代码,供大家参考,具体内容如下

给定一个数组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]。

不能使用除法。

代码

解法一

暴力法,这是本能就能想到的解决办法。

public static int[] multiply(int[] array) {
 if (array == null) {
 return null;
 }
 int len = array.length;
 if (len == 0) {
 return null;
 }
 int[] result = new int[len];
 for (int i = 0; i < len; i++) {
 int multiply = 1;
 for (int j = 0; j < len; j++) {
  if (j != i) {
  multiply *= array[j];
  }
 }
 result[i] = multiply;
 }
 return result;
 }

解法二

从中可以看出通过数组A计算数组B的时候,红色部分不参与乘积的计算,以红色部分做分割,可以看错是红色左边部分的乘积与红色右边部分乘积的乘积

所以此时先根据数组A把对应左边部分的乘积和右边部分的乘积分别计算出来得到两个新的数组,即LEFT和RIGHT

这样可以得到公式:B[i]=LEFT[i]*RIGHT[i],如下所示

  • 对于B[0],因为没有左边部分,可以认为是1*RIGHT[0]
  • 如果B[n-1],没有右边部分,所以认为是LEFT[n-1]*1

以下是代码实现

public static int[] multiply2(int[] array) {
 if (array == null) {
 return null;
 }
 int len = array.length;
 if (len == 0) {
 return null;
 }
 int[] left = new int[len];
 int[] right = new int[len];
 int[] result = new int[len];
 // 数组B中第一个数字没有左边部分,所以左边乘积数组第一个数字是1
 left[0] = 1;
 // 计算B[i]对应的在A中的左边部分的乘积,数组A从前向后计算
 for (int i = 1; i < len; i++) {
 // 因为要B[i]不需要计算A[i],所以左边部分的乘积计算其实需要的是A中对应下标i的上一个下标及之前的数字
 left[i] = left[i - 1] * array[i - 1];
 }
 // 数组B中最后一个数字没有右边部分,所以右边乘积数组的最后一个数字是1
 right[len - 1] = 1;
 // 计算B[i]对应的在A中的右边部分的乘积,数组A从后向前计算,这样才可以一次遍历完
 // 因为计算可以用到上一次的结果,即上一次的结果*本次下标的值
 for (int i = len - 1; i > 0 ; i--) {
 // 因为要B[i]不需要计算A[i],所以右边部分的乘积计算其实需要的是A中对应下标i的下一个下标及之后的数字
 right[i - 1] = right[i] * array[i];
 }
 for (int i = 0; i < len; i++) {
 result[i] = left[i] * right[i];
 }
 return result;
 }
 
 
 public static void main(String[] args) {
 int[] array = {1, 2, 3, 4};
 int[] result = multiply2(array);
 for (Integer i : result) {
 System.out.print(i + " ");
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java过滤器filter_动力节点Java学院整理

    Java过滤器filter_动力节点Java学院整理

    这篇文章主要介绍了Java过滤器filter,通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出
    2017-07-07
  • 使用mybatis-plus报错Invalid bound statement (not found)错误

    使用mybatis-plus报错Invalid bound statement (not found)错误

    这篇文章主要介绍了使用mybatis-plus报错Invalid bound statement (not found)错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java中的权重算法(如Dubbo的负载均衡权重)详解

    Java中的权重算法(如Dubbo的负载均衡权重)详解

    这篇文章主要介绍了Java中的权重算法(如Dubbo的负载均衡权重)详解,负载均衡,其含义就是指将负载进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务,需要的朋友可以参考下
    2023-08-08
  • Java多种方式动态生成doc文档

    Java多种方式动态生成doc文档

    这篇文章主要为大家详细介绍了Java动态生成doc文档的多种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Java 中的 xx ≠ null 是什么新语法

    Java 中的 xx ≠ null 是什么新语法

    Java中null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。本文给大家分享Java 中的 xx ≠ null 是什么新语法,感兴趣的朋友一起看看吧
    2021-06-06
  • Java实现操作excel表格

    Java实现操作excel表格

    在日常工作中,对Excel工作表格的操作处理可是多的数不清楚,下面是java语言对其的操作,有需要的小伙伴可以参考下
    2015-10-10
  • java高并发InterruptedException异常引发思考

    java高并发InterruptedException异常引发思考

    这篇文章主要为大家介绍了java高并发InterruptedException异常引发思考,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java Json字符串的双引号(

    Java Json字符串的双引号("")括号如何去掉

    这篇文章主要介绍了Java Json字符串的双引号("")括号如何去掉?具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 如何将Object类转换为实体类

    如何将Object类转换为实体类

    这篇文章主要介绍了如何将Object类转换为实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 使用JavaIO流和网络制作一个简单的图片爬虫

    使用JavaIO流和网络制作一个简单的图片爬虫

    这篇文章主要介绍了使用JavaIO流和网络制作一个简单的图片爬虫,通过关键字爬取百度图片,这个和我们使用搜索引擎搜索百度图片是一样的,只是通过爬虫可以学习技术的使用,需要的朋友可以参考下
    2023-04-04

最新评论