腾讯2012实习生笔试题(加分题):
给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。在构造过程:
a)不允许使用除法;
b)要求O(1)空间复杂度和O(n)时间复杂度;
c)除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);
请用程序实现并简单描述。
题意应该不难理解,乍一看有点儿无从下手的感觉,思考后没有突破的话就想放弃了。看到网上其他同学也给出了解法,代码很简洁,但是理解起来不是很直观。于是决定在纸上写写画画,写完后恍然大悟。所以,以后遇到问题,没有思路的时候不妨写写画画,保不准在这个过程中就有了思路。看过下面这张图后,就比较容易理解解题代码了。
具体代码的话可以参考CSDN上一位同学写的,代码很简洁,http://blog.csdn.net/wumuzi520/article/details/7841280
1 void Translate(int a[], int b[], int n) 2 { 3 b[0] = 1; 4 for (int i = 1; i <= n-1; i++) 5 { 6 b[i] = b[i-1]*a[i-1]; 7 } 8 9 for (int i = n-1; i >= 1; i--) 10 { 11 b[i] *= b[0]; 12 b[0] *= a[i]; 13 } 14 }
构造b[N]
时间: 2024-10-12 09:03:11