问题描述:
给定一数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法:
要求O(1)空间复杂度和O(n)的时间复杂度;
除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、堆空间和全局静态变量等);
实现程序(主流编程语言任选)实现并简单描述。
#include <stdlib.h>
#include <string.h>
int* func(const int* array,
const size_t length){
size_t index = 1;
int *b = NULL;
if (length < 2 ||
!(b = (int *)malloc(sizeof(int)*length)))
return b;
b[length-1] = array[0]; //缓存正向累积
b[0] = array[length-1]; //缓存逆向累积
for (; index < length-1; ++index){
/*对未初始化数据初始化*/
if(index <= length-1-index)
b[index] = b[length-1-index] = 1;
/*计算乘积*/
b[index] *= b[length-1];
b[length-1-index] *= b[0];
/*更新缓存*/
b[0] *= array[length-1-index];
b[length-1] *= array[index];
}
return b;
}
int main(){
size_t index = 0;
int a[6] = {1,2,3,4,5,6};
int *b = func(a, 6);
if (b){
for(; index < 6; ++index)
printf("%-4d", b[index]);
free(b);
}
return 0;
}