给定一个数组a[N],我们希望构造数组b[N]。。(2013腾讯实习生笔试题)
2015-01-03 09:47
399 查看
题目:给定一个数组a
,我们希望构造数组b
,其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。
在构造过程:不允许使用除法;
要求:O(1)空间复杂度和O(n)时间复杂度;
除遍历计数器与a
b
外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);
请用程序实现并简单描述。
方法一:首先进行一次迭代:
i:1-n-1
b[i]=b[i-1]*a[i-1];
这样下去就是:
b[1] = a[0]
b[2] = a[0]a[1]
…
b[i] = a[0]a[1]a[2]…a[i-1]
…
b[n-1] = a[0]a[1]…a[n-2]
…
b[i] = a[0]a[1]a[2]…a[i-1]
…
b[n-1] = a[0]a[1]…a[n-2]
然后进行二次迭代。。通过不断扩展b[0],来实现数组转换
通过b[0]这个变量来迭代出1, a[n-1], a[n-2]a[n-1], a[n-3]a[n-2]a[n-1], … , a[1]a[2]a[3]…a[n-1],迭代过程中分别乘以b[n-1], b[n-2], … , b[0]
代码:
方法二:
方法三:
,我们希望构造数组b
,其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。
在构造过程:不允许使用除法;
要求:O(1)空间复杂度和O(n)时间复杂度;
除遍历计数器与a
b
外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);
请用程序实现并简单描述。
方法一:首先进行一次迭代:
i:1-n-1
b[i]=b[i-1]*a[i-1];
这样下去就是:
b[1] = a[0]
b[2] = a[0]a[1]
…
b[i] = a[0]a[1]a[2]…a[i-1]
…
b[n-1] = a[0]a[1]…a[n-2]
…
b[i] = a[0]a[1]a[2]…a[i-1]
…
b[n-1] = a[0]a[1]…a[n-2]
然后进行二次迭代。。通过不断扩展b[0],来实现数组转换
通过b[0]这个变量来迭代出1, a[n-1], a[n-2]a[n-1], a[n-3]a[n-2]a[n-1], … , a[1]a[2]a[3]…a[n-1],迭代过程中分别乘以b[n-1], b[n-2], … , b[0]
代码:
void Translate(int a[], int b[], int n) { b[0] = 1; for (int i = 1; i <= n-1; i++) { b[i] = b[i-1]*a[i-1]; } for (int i = n-1; i >= 1; i--) { b[i] *= b[0]; b[0] *= a[i]; } }
方法二:
//方法二,保持a数组不变 void makeArray(int a[],int b[],int len) { int i; b[0] = 1; for(i = 1 ; i < len ; ++i) { b[0] *= a[i-1]; b[i] = b[0]; // b[i] = a[0]*a[1]*...*a[i-1] } b[0] = 1; for(i = len - 2 ; i > 0 ; --i) { b[0] *= a[i+1]; // b[0] = a[i+1]*a[i+2]...*a[len-1] b[i] *= b[0]; // b[i] = a[0]*a[1]*...*a[i-1]*a[i+1]*...*a[len-1] } b[0] *= a[1]; }
方法三:
/* 思路:进行3趟扫描 第一趟从左到右对A进行累乘,结果保存在B数组中,b[i] = b[i-1]*a[i-1]; 第二趟从右到左对A进行累乘,结果写入A中,a[i]=a[i+1]*a[i]; 第三趟从左到右,然后B数组对应位置的元素等于其前一个位置的元素与A中其后一个位置的元素的乘积。b[i] = a[i+1] * b[i-1] */ void makeArray(int a[],int b[],int len) { int i; b[0] = 1; for(i = 1 ; i < len ; ++i) b[i] = b[i-1] * a[i-1]; // b[0] = 1 , b[i] = a[0]*a[1]*...*a[i-1] a[len - 1] = a[len - 1]^a[len - 2]; //不使用中间变量,通过位运算来交换两个变量 a[len - 2] = a[len - 1]^a[len - 2]; a[len - 1] = a[len - 1]^a[len - 2]; for(i = len - 3 ; i >= 0 ; --i) { a[len - 1] = a[i + 1] * a[len - 1]; a[i] = a[i]^a[len - 1]; //交换两个变量 a[len - 1] = a[i]^a[len - 1]; a[i] = a[i]^a[len - 1]; } a[len - 1 ] = 1; //a[len - 1 ] = 1 , a[i] = a[i+1]*a[i+2]*...*a[len-1] for(i = 0 ; i < len ; ++i) b[i] = a[i] * b[i]; }
相关文章推荐
- 给定一个数组a[N],我们希望构造数组b[N]。。(2013腾讯实习生笔试题)
- 【搜狗笔试题】给定一个数组a[N],我们希望构造数组b[N]
- 【腾讯2012年实习生笔试加分题】不使用除法,由给定数组a[N]构造数组b [N],其中b[j]=a[0]*a[1]*…*a[N-1] / a[j]
- 腾讯的一道笔试加分题——给定一个数组构造另一个数组
- 给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法
- 给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法
- 给定数组a[N]构造数组b [N]——腾讯笔试
- 给定数组a[N]构造数组b[N]——腾讯笔试
- 一道腾讯笔试题(已知一个数组,不使用除法构造另一数组)
- 给定一数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j]
- 【IT笔试面试题整理】给定一个数组a[N]构造数组b [N]
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数---百度笔试题
- 2013(4月)腾讯实习生招聘(测试开发)从笔试到一面
- 腾讯2013校园实习生招聘笔试题,附答案
- 【笔试or面试】腾讯2013实习生面试
- 【实习生笔试面试】腾讯2013实习生电话面试总结
- 给定一个排序数组,如何构造一个二叉排序树?
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]
- 【原创】2013腾讯实习生笔试附加题1及解法
- 整型数组处理算法(十)给定数组a[n],其中有超过一半的数为一个定值,找出这个数。[2014人人网笔试题]