我最近在电话中被问到以下面试问题:
给定一个整数数组,生成一个数组,其值是除当前索引之外的所有其他整数的乘积。
例子:
[4, 3, 2, 8] -> [3*2*8, 4*2*8, 4*3*8, 4*3*2] -> [48, 64, 96, 24]
我想出了以下代码:
public static BigInteger[] calcArray(int[] input) throws Exception {
if (input == null) {
throw new IllegalArgumentException("input is null");
}
BigInteger product = calculateProduct(input);
BigInteger result[] = new BigInteger[input.length];
for (int i = 0; i < input.length; i++) {
result[i] = product.divide(BigInteger.valueOf(input[i]));
}
return result;
}
private static BigInteger calculateProduct(int[] input) {
BigInteger result = BigInteger.ONE;
for (int i = 0; i < input.length; i++) {
result = result.multiply(BigInteger.valueOf(input[i]));
}
return result;
}
复杂:
Time Complexity: O(n)
Space Complexity: O(n)
我们可以在没有除法的情况下以 O(n) 复杂度做到这一点吗?如果使用简单的原始整数数组,还有什么方法可以降低空间复杂度。
函数式编程
富国沪深
相关分类