1、腾讯面试题:给定一数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法:
要求O(1)空间复杂度和O(n)的时间复杂度;
除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、堆空间和全局静态变量等);
要求O(1)空间复杂度和O(n)的时间复杂度;
除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、堆空间和全局静态变量等);
实现程序(主流编程语言任选)实现并简单描述。
void main(void){
int a[5]={1,3,5,7,9};
int b[5];
int i;
b[0]=1;
for (i=1;i<5;i++){
b[i]=b[i-1]*a[i-1];
}
for(i=3;i>=0;i--){
b[0]*=a[i+1];
if(i==0)
break;
b[i]*=b[0];
}
for(i=0;i<5;i++){
printf("%d ",b[i]);
}
}
2、随机生成和为S的N个正整数——投影法
参考 http://blog.csdn.net/morewindows/article/details/8439393
假设生成和为20的4个正整数:
#include<time.h>
int sort(int *array,int len){
int i=0;
int j=0;
unsigned tmp;
for(i=0;i<len-1;i++){
for(j=0;j<len-i-1;j++){
if(array[j]>array[j+1]){
tmp = array[j];
array[j] = array[j+1];
array[j+1] =tmp;
}
}
}
for(i=0;i<len;i++){
printf("%d ",array[i]);
}
printf("\n");
return 0;
}
int generate(){
int i=0,a[3],b[4];
srand((unsigned )time(NULL));
for(i=0;i<3;i++){
a[i]=rand()%20;
printf("%d ",a[i]);
}
printf("\n");
sort(a,3);
printf("///\n");
b[0]=a[0];
printf("%d ",b[0]);
for(i=1;i<3;i++){
b[i]=a[i]-a[i-1];
printf("%d ",b[i]);
}
b[3]=20-a[2];
printf("%d ",b[3]);
printf("\n");
}
void main(){
generate();
}