我有一个包含 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/