一道很有意思的算法面试题,题目要求如下:
输入:一个长度为n的整数数组input;
输出:一个长度为n的整数数组,满足result [ i ]=input数组中除了input [ i ]以外的数的乘积,比如输入为:input={2,3,4,5},输出为result={60,40,30,24};
要求:具有线性复杂度,且不能使用除法运算符。
C/C++:
int *cal(int *input,int n);
Java:
int[] cal(int [] input);
实现目标,时间复杂度为O(n),空间复杂度为O(1),程序代码如下:
#include<iostream>
using namespace std;
int *cal(int *input, int n);
int main(){
int n;
cin >> n;
int *input = new int[n];
for (int i = 0; i < n; i++){
cin >> input[i];
}
int *result = cal(input, n);
for (int i = 0; i < n; i++){
cout << result[i] << ends;
}
cout << endl;
delete []result;
delete []input;
return 0;
}
int *cal(int *input, int n){
int i;
int *result = new int[n];
result[0] = 1;
//将位置i的左边的乘积放在i的位置;
for (i = 1; i < n; i++){
result[i] = result[i - 1] * input[i-1];
}
//将位置i的值与其右边的乘积相乘;
for (i = n - 1; i > 0; i--){
result[i] *= result[0];
result[0] *= input[i];
}
return result;
}