Careercup - Facebook面试题 - 5179916190482432

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 }

 

你可能感兴趣的:(Facebook)