Java - 将数组值乘以另一个数组

标签 java arrays algorithm

我有一个包含 x 值(x 可以由用户定义)的 int[] 数组,这些值是 1 到 9 之间的随机整数。现在我想创建另一个具有相同值的数组值的数量,新数组的每个值都是来自另一个数组的所有值的乘积,相同索引除外。

例如:

  • 数组 1:{4,3,5,7}
  • 数组 2:{3*5*7, 4*5*7, 4*3*7, 4*3*5} = {105, 140, 84, 60}

这是我所拥有的:

public static int[] multiplyArrayValues (int [] values) {

    int array[] = new int[values.length];

    for (int y = 0; y < array.length; y++) {
        array[y] = 1;
    }

    /*for (int i = 0; i < array.length; i++) {      // wrong                        
        for (int z = 0; z < x; z++) {                           
            if (z != i) {                                                   
                array[i] = array[i] * values[z];                                        
            }               
        }           
    }*/

    return array;
}  

困难在于,为了提高性能,我必须避免 for 循环中的 for 循环。这就是为什么那个 block 被注释掉的原因。不允许分割。

最佳答案

更多的是关于要使用的算法的问题。您可以将原始数组的所有数字相乘,我们称之为 p。现在新数组中 i 位置的数字是 p/values[i]

如果一定不能使用除法,可以设置两个临时数组,一个包含索引较小或相等的值的乘积,另一个包含索引较大或相等的值的乘积。

s[i] = product of v[j] where j <= i
l[i] = product of v[j] where j >= i

两个数组都可以设置一个简单的循环。

现在您可以将 array[i] 计算为 s[i-1] * l[i+1],特别注意边界值。这也只需要一个简单的循环。

使用这些想法并进行一些优化导致以下代码

public static int[] multiplyArrayValues (int [] values) {
    int[] a = new int[values.length];
    int p = 1;
    for (int i = values.length - 1; i >= 0; i--) {
        a[i] = p;
        p *= values[i];
    }
    p = 1;
    for (int i = 0; i < values.length; i++) {
        a[i] *= p;
        p *= values[i];
    }
    return a;
}

关于Java - 将数组值乘以另一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34894271/

相关文章:

php - 有没有办法将 "encode"PHP 数组转换成 PHP 代码?

arrays - 如何在 Julia 中获取数组的大小?

algorithm - 处理大量的微依赖

algorithm - 树中所有边不相交路径的列表

algorithm - 有效检查Scala流中的​​值是否存在(以功能方式)

java - 数组索引越界异常

数组映射上的 Java ArrayIndexOutOfBounds 异常

java - 在 Spring Data cassandra 中查询两列

java - 如何均匀化 JTable 中的组件大小?

c++ - C++中的多维数组代码出错