一道腾讯笔试题(已知一个数组,不使用除法构造另一数组)
2014-03-18 10:11
197 查看
题目:给定一数组a
,我们希望构造数组b
,其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法;要求O(1)空间复杂度和O(n)的时间复杂度。
观察b[j]的构造公式,发现它实际上是由两部分相乘得到。左边是a[i]到a[j-1]的乘积,右边是a[j+1]到a[N-1]的乘积,中间的a[j]被除掉了。接下来就是怎么实现的问题了。先从左向右扫描a
数组,将坐标左边的元素累乘起来存入b
;然后可用一个变量保存右边数组元素乘积,从右向左扫描一遍,依次将b
和乘积变量相乘即可。
形成代码如下:
,我们希望构造数组b
,其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法;要求O(1)空间复杂度和O(n)的时间复杂度。
观察b[j]的构造公式,发现它实际上是由两部分相乘得到。左边是a[i]到a[j-1]的乘积,右边是a[j+1]到a[N-1]的乘积,中间的a[j]被除掉了。接下来就是怎么实现的问题了。先从左向右扫描a
数组,将坐标左边的元素累乘起来存入b
;然后可用一个变量保存右边数组元素乘积,从右向左扫描一遍,依次将b
和乘积变量相乘即可。
形成代码如下:
#include <iostream> using namespace std; #define N 5 void main() { int a = {5, 2, 3, 4, 1}; int b ; int i, j; int RightProduct = 1; b[0] = 1; for (i=1; i<N; i++) { b[i] = a[i-1]*b[i-1]; } for (j=N-1; j>=0; j--) { b[j] = b[j] * RightProduct; RightProduct = RightProduct * a[j]; } for (i=0; i<N; i++) cout << b[i] << " "; cout << endl; }运行截图
相关文章推荐
- (CVTE 笔试题)已知一个数组,不使用除法构造另一数组。
- 【腾讯2012年实习生笔试加分题】不使用除法,由给定数组a[N]构造数组b [N],其中b[j]=a[0]*a[1]*…*a[N-1] / a[j]
- 腾讯的一道笔试加分题——给定一个数组构造另一个数组
- 给定一个数组a[N],我们希望构造数组b[N]。。(2013腾讯实习生笔试题)
- 给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法
- 给定一个数组a[N],我们希望构造数组b[N]。。(2013腾讯实习生笔试题)
- 给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法
- 某年的腾讯笔试题——不使用除法运算产生新数组
- 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。
- 给定数组a[N]构造数组b [N]——腾讯笔试
- 腾讯笔试题一道(max宏定义,不使用大于,小于,if语句)
- C++在同一行输入多个整数(用空格分开)储存到一个数组中(+一道笔试题)
- 编程在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,用空格来分隔单词(只使用循环,数组)
- 一道编程之美上的问题-腾讯的笔试题目:求数组的部分乘积
- 给定数组a[N]构造数组b[N]——腾讯笔试
- 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法
- 一道排序笔试题,在o(n)时间内对一个数组进行排序
- 已知一个数组a[N],构造一个数组b[N],构造规则:b[i]=a[0]*a[1]*a[2]...a[N]/a[i];
- 一道笔试题——由数组中除了一个数之外的其他数的乘积生成另一个数组
- 腾讯笔试题一道(max宏定义,不使用大于,小于,if语句)