Careercup - Facebook面试题 - 5179916190482432

本文介绍了一种在不使用除法的情况下,将数组中每个元素替换为其余元素乘积的算法实现。通过两次遍历,先计算左侧元素的累积乘积,再结合右侧累积乘积完成目标转换,实现了O(n)的时间复杂度。

2014-05-01 00:45

题目链接

原题:

input [2,3,1,4] 
output [12,8,24,6] 

Multiply all fields except it's own position. 

Restrictions: 
1. no use of division 
2. complexity in O(n)

题目:给定一个整数数组,将个元素变为其他元素的乘积,例如[2, 3, 1, 4]变为[12, 8, 24, 6]。限制不准用除法,而且时间复杂度为线性级别。

解法:用一个额外的数组能够完成O(n)时间的算法。由于每个元素在变化之后,应该等于左边和右边的累计乘积,所以两边的累计乘积必须同时能够知道。一边可以用O(1)空间扫描得到,另一边只能用O(n)空间进行记录。时间空间复杂度均为O(n),请看代码。

代码:

 1 // http://www.careercup.com/question?id=5179916190482432
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5 
 6 void multiplyArray(vector<int> &v)
 7 {
 8     vector<int> vp;
 9     int p;
10     int i;
11     int n = (int)v.size();
12     
13     vp.resize(n);
14     p = 1;
15     for (i = 0; i <= n - 1; ++i) {
16         vp[i] = p;
17         p *= v[i];
18     }
19     
20     p = 1;
21     for (i = n - 1; i >= 0; --i) {
22         vp[i] = p * vp[i];
23         p *= v[i];
24     }
25 
26     for (i = 0; i < n; ++i) {
27         v[i] = vp[i];
28     }
29     
30     vp.clear();
31 }
32 
33 int main()
34 {
35     int i, n;
36     vector<int> v;
37     
38     while (scanf("%d", &n) == 1 && n >= 0) {
39         v.resize(n);
40         for (i = 0; i < n; ++i) {
41             scanf("%d", &v[i]);
42         }
43         multiplyArray(v);
44         for (i = 0; i < n; ++i) {
45             printf((i ? " %d" : "%d"), v[i]);
46         }
47         putchar('\n');
48     }
49     
50     return 0;
51 }

 

转载于:https://www.cnblogs.com/zhuli19901106/p/3702438.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值