题目:给定一个数组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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)
分析:连乘问题首先要考虑有没有0
首先计算A数组的长度,将B初始化为同size的数组(各元素均为0)
然后遍历A数组,找其中0元素的个数,并将其索引保存下来,若找到两个以上0元素,则B数组均为0;
若找到1个0元素,则B数组只有一个索引不为0,其他索引均为0;
若没有找到0元素,则使用土办法进行计算。
1 #include <iostream>
2 #include <vector>
3
4 using namespace std;
5
6 class Solution
7 {
8 public:
9 vector<int> multiply(const vector<int>& A)
10 {
11 int num = A.size();
12 vector<int> zero;
13 vector<int> result;
14
15 for (int i = 0; i < num; i++)
16 {
17 result.push_back(0);
18 if (A[i] == 0) zero.push_back(i);
19 }
20 if (zero.size() == 1)
21 {
22 //修改此值 result[zero[0]]
23 int temp = zero[0];
24 int sum = 1;
25 for (int i = 0; i < num; i++)
26 {
27 if (i!=temp)
28 sum *= A[i];
29 else continue;
30 }
31 result[temp] = sum;
32 }
33
34 else if (zero.size() == 0)//修改所有result值
35 {
36 int j = 0;
37 while (j<num)
38 {
39 int sum = 1;
40 for (int i = 0; i < num; i++)
41 {
42 if (i != j)
43 {
44 sum *= A[i];
45 }
46 else continue;
47 result[j] = sum;
48 }
49 j += 1;
50
51 }
52 }
53 return result;
54 }
55 };
56
57 int main()
58 {
59 Solution sol;
60 vector<int> result;
61 vector<int> A{ 1, 2, 0, 4, 5 };
62 result = sol.multiply(A);
63
64 for (int i = 0; i < A.size();i++)
65 cout << result[i] << endl;
66
67 int u;
68 cin >> u;
69 return 0;
70 }