数组乘积(2012,小米、搜狗、腾讯)
输入:一个长度为n的整数数组input
输出:一个长度为n的整数数组result,满足result[i] = input数组中除了input[i]之外所有数的乘积(假设不会溢出)。比如输入:input={60,40,30,24}。
程序要求:具有线性复杂度,且不能使用除法运算符。
C/C++:
int *cal(int * input,int n)
思路:
left[i] 存储input[i]之前所有元素的乘积,right[i]存储input[i]之后所有元素的乘积,那么result[i]=left[i] *right[i]。
left[i] 的计算从左往右遍历元素一遍得出,right[i]的计算从右往左遍历元素一遍得出。时间复杂度为O(n),空间复杂度为O(n)。
代码:
#include <iostream>
using namespace std;
int *cal(int* input,int n) //时间复杂度为O(n),空间复杂度为O(n)
{
int i;
int *left = new int[n]; //存储input[i]之前所有元素的乘积
int *right = new int[n]; //存储input[i]之后所有元素的乘积
int *result = new int[n];
left[0]=1;
right[n-1]=1;
for(i=1;i<n;i++)
left[i] = left[i-1]*input[i-1];
for(i=n-2;i>=0;i--)
right[i] = right[i+1]*input[i+1];
for(i=0;i<n;i++)
result[i] = left[i]*right[i];
return result;
}
int *cal2(int* input,int n) //时间复杂度为O(n),空间复杂度为O(1)
{
int i;
int *result = new int[n];
result[0]=1;
for(i=1;i<n;i++)
result[i]=result[i-1]*input[i-1];
result[0]=input[n-1];
for(i=n-2;i>0;i--)
{
result[i] *= result[0];
result[0] *= input[i];
}
return result;
}
int main()
{
int n,i;
cin>>n;
int *input = new int[n];
int *result1 = new int[n];
int *result2 = new int[n];
for(i=0;i<n;i++)
cin>>input[i];
result1=cal(input,n);
result2=cal2(input,n);
for(i=0;i<n;i++)
cout<<result1[i]<<' ';
cout<<endl;
for(i=0;i<n;i++)
cout<<result2[i]<<' ';
cout<<endl;
delete []input;
delete []result1;
delete []result2;
return 0;
}
总结:
1.当数组的大小未知时,需要动态声明一维数组,声明格式如下:
int* a = new int[n];
当数组使用完毕,需要使用:
delete []a;
释放内存空间