2016-01-20 101 views
0

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

因此,例如:

  • 数组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; 
} 

的困难是,我必须避免为了性能而在循环中循环。这就是为什么这一块被注释掉了。分割是不允许的。

+0

允许'1'吗?您不能从乘法结果中“排除”它:{1,1,2,3} => {1 * 2 * 3,1 * 2 * 3,1 * 1 * 3,1 * 1 * 2 } = {6,6,3,2}' –

+0

@SimonKraemer这些数字是随机的,只是在1到9之间的atm。稍后,负数和/或用户输入将被添加。所以是的,1是允许的,即使它在你离开时没有改变。 – abrjak01

回答

4

这更多的是关于要使用的算法的问题。你可以乘以原始数组的所有数字,让我们打电话给这个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; 
} 
+0

我认为要完整回答这个采访问题,您应该将s/l包装到源/目标数组对中(应该可以填充目标前进和腐败源向后)。 OP应该询问面试官是否允许额外的阵列以及腐蚀源是否正常。 –

2

首先乘以数组中的所有元素。然后遍历所有元素并将之前计算的乘法除以当前项目。

1

即可成倍的所有号码,并保存它的变量(比如产品),现在在阵列上使用单回路迭代,并划分产品按每个指数的数量(产品/ a [i])计算。

但是,由于您使用的是整数,如果数组的大小很大,并且数组值很大,则产品可能会溢出int。

考虑使用大整数我会说。

0
import java.util.Arrays; 

public class Main { 

    static int[] multiplyArrayValues(int[] values) { 
     int product = 1; 
     for(int i = 0; i < values.length; i++){ 
      product *= values[i]; 
     } 
     int[] result = new int[values.length]; 
     for (int i = 0; i < result.length; i++) { 
      result[i] = product/values[i]; 
     } 
     return result; 
    } 

    static void testMultiplyArrayValues(int[] values) 
    { 
     System.out.println(Arrays.toString(values) + " => " + Arrays.toString(multiplyArrayValues(values))); 
    } 


    public static void main(String[] args) { 
     testMultiplyArrayValues(new int[] {1,1,2,3}); 
     testMultiplyArrayValues(new int[] {4,3,5,7}); 
     testMultiplyArrayValues(new int[] {9,9,9,9}); 
     testMultiplyArrayValues(new int[] {1,1,1,1}); 
     testMultiplyArrayValues(new int[] {1,2,3,4}); 
    } 

} 

输出:

[1, 1, 2, 3] => [6, 6, 3, 2] 
[4, 3, 5, 7] => [105, 140, 84, 60] 
[9, 9, 9, 9] => [729, 729, 729, 729] 
[1, 1, 1, 1] => [1, 1, 1, 1] 
[1, 2, 3, 4] => [24, 12, 8, 6] 

如果可能的值的范围变化,你可能要改变的product的数据类型和multiplyArrayValues返回值。 也没有检查值为负值或无效值。零将导致崩溃。

+0

由于分割是不允许的,我不能使用你的解决方案,但它会工作,非常感谢你! – abrjak01

+0

好的,我错过了你的编辑... –

相关问题