受限的操作下迭代技巧之一道腾讯笔试题
来源:互联网 发布:中易智联软件多少钱 编辑:程序博客网 时间: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]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);
(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讨论了一下,此种方法是因是众多迭代方法中技巧较高而且几近完美的一种方案。代码及运行结果如上。
- 受限的操作下迭代技巧之一道腾讯笔试题
- 一道腾讯的笔试题
- 腾讯的一道笔试题
- 一道腾讯笔试题
- 找工作练手--一道腾讯的笔试题
- 一道腾讯笔试题的思路
- 从腾讯的一道笔试题说起
- 腾讯实习生的一道笔试题
- 一道腾讯笔试题--Integer的比较
- 腾讯2013的一道实习生笔试题
- 指针与字符串操作-一道腾讯笔试题
- 一道腾讯实习笔试题
- 2015腾讯在线笔试的一道编程题
- 一道腾讯多线程笔试题的问题和思考
- 一道爱立信改自腾讯笔试题
- 2012腾讯笔试题回忆一道
- 求解一道腾讯笔试题(帮帮忙)
- sizeof(struct)---一道腾讯笔试题
- tomcat配置双向认证,客户端证书pkcs12格式,方便导入浏览器
- POJ_2253(最短路问题变形)
- 使用Lua CJSON库进行encode与decode操作完成对Json数据转化
- HMM学习2之前向算法(转)
- poj 1144
- 受限的操作下迭代技巧之一道腾讯笔试题
- IOS 常用的宏定义(一)
- Java DataBase Connection
- 浏览器内核分析
- 日历函数
- C++中指针和引用的区别
- DB2 oralce mysql 取前十条记录对比
- 效率利器2-tmux
- Android Notes 00 - Services