受限的操作下迭代技巧之一道腾讯笔试题

来源:互联网 发布:中易智联软件多少钱 编辑:程序博客网 时间:2024/04/30 12:58
腾讯2012及2013实习生招聘之加分题一:给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。在构造过程中:
(1)不允许使用除法;
(2)要求O(1)空间复杂度和O(N)时间复杂度;
(3)除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);

(4)请用程序实现并简单描述。


参考了部分解答http://www.cnblogs.com/jerry19880126/archive/2012/08/13/2637079.html,自己写了一遍。

/* * Tencent_campus_intern_2013.c */#include <stdio.h>#define N ( 10 )typedef int TYPE;/* * within O(1) space and O(N) Time, filling up array b such that each b[i] = a[0]*a[1]*a[2]*...*a[N-1]/a[i], division is not a permitted operator. */static void func(TYPE a[], TYPE b[], int i){for(b[0]=1,i=1; i<N; i++){b[i] = b[i-1]*a[i-1];}for(b[0]=a[N-1],i=N-2; i>=1; i--){b[i] = b[i] * b[0];b[0] = b[0] * a[i];}}int main( int argc, char ** argv){TYPE a[N] = {1,2,3,4,5,6,7,8,9,10}; // test dataTYPE b[N];int i;func(a,b,i);for(i=0;i<N;i++){printf("a[%d]=%-2d, b[%d]=%d\n", i+1, a[i], i+1, b[i]);}return 0;}



运算中要求不准另辟变量,而且要求线性复杂度,按照题目的意思,那么多数字的相乘,应该是只能使用迭代了,注意到可以使用的变量就只有数组a和b,大胆想象一下数组a和数组b的值在最终计算结果出炉之前均应该是可以改动的(题设没有规定数组a的值不允许修改),但是仔细审视一下,还是尽量莫要修改数组a的值。那么,问题就变成如何在线性访问数组a并同时访问数组b的时候完陈迭代呢?网上给的比较巧妙的方法有点分治法的味道,有点儿技巧。鄙人琢磨之,重新构建了一下代码。和lpskyhigh讨论了一下,此种方法是因是众多迭代方法中技巧较高而且几近完美的一种方案。代码及运行结果如上。


原创粉丝点击