Java构建乘积数组的方法

所属分类: 软件编程 / java 阅读数: 25
收藏 0 赞 0 分享

本文实例为大家分享了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 + " ");
 }

}

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

更多精彩内容其他人还在看

SpringBoot环境搭建及第一个程序运行(小白教程)

这篇文章主要介绍了SpringBoot环境搭建及第一个程序运行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

过滤器 和 拦截器的 6个区别(别再傻傻分不清了)

这篇文章主要介绍了过滤器 和 拦截器的 6个区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

SpringBoot整合SpringTask实现定时任务的流程

这篇文章主要介绍了SpringBoot整合SpringTask实现定时任务的流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

vscode快速引入第三方jar包发QQ邮件

这篇文章主要介绍了vscode快速引入第三方jar包发QQ邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Java Enum和String及int的相互转化示例

这篇文章主要介绍了Java Enum和String及int的相互转化示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring boot如何快速的配置多个Redis数据源

这篇文章主要介绍了Spring boot如何快速的配置多个Redis数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

JAVA 对接腾讯云直播的实现

这篇文章主要介绍了JAVA 对接腾讯云直播的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

JavaSE static final及abstract修饰符实例解析

这篇文章主要介绍了JavaSE static final及abstract修饰符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

SpringBoot定时任务参数运行代码实例解析

这篇文章主要介绍了SpringBoot定时任务运行代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring Boot调用 Shell 脚本实现看门狗功能

这篇文章主要介绍了Spring Boot调用 Shell 脚本实现看门狗功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多