9.18(40. 組合總和 II 43.字串相乘)
阿新 • • 發佈:2019-02-16
40. 組合總和 II
本題是上一道題最後一種解法的變形,只需要在其中天上一個條件即可
程式程式碼如下(可正確執行)
class Solution { public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { vector<vector<int>> result; vector<int> res; sort(candidates.begin(), candidates.end()); com(candidates, 0, target, res, result); return result;//直接返回就行了 } void com(vector<int> &candidates, int index, int target, vector<int> res, vector<vector<int>> &result) { if (target == 0) { result.push_back(res); return; } else if (target < 0) return; else { for (int i = index; i < candidates.size(); i++) { res.push_back(candidates[i]); com(candidates, i + 1, target - candidates[i], res, result); res.pop_back(); while (i<=candidates.size()-2&&candidates[i + 1] == candidates[i]) i++; } } } }; int main() { int n,target; cin >> n>>target; vector<int> arr(n); for (int i = 0; i < n; i++) { cin >> arr[i]; } Solution bb; vector<vector<int>> s = bb.combinationSum2(arr,target); for (int i = 0; i < s.size(); i++) { for (int j = 0;j< s[i].size(); j++) { cout<<s[i][j]<<" "; } cout << endl; } return 0; }
43.字串相乘
long long支援的十進位制大約是19位,因此對於110位的資料來說只能理解成字串。
思路一:
把資料寫成vector的形式,Node是一種資料結構,裡面包含factor和power分別表示係數以及對應的級數;採用的策略就是對構建的向量逐步調整。
// prictice.cpp: 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include<cmath> #include<iostream> #include<string> #include<cassert> #include<vector> #include<limits> #include <algorithm> //引入這個之後排序才能使用 using namespace std; //思路:類似於連結串列下的乘法 struct Node{ int factor;//表示係數 int power;//表示次方 }; class Solution { public: string multiply(string num1, string num2) { if (num1 == "0" || num2 == "0") return "0"; string s; vector<Node> sn1(num1.size()); vector<Node> sn2(num2.size()); vector<Node> result;//長度是未知的 for (int i = 0; i < num1.size(); i++) { sn1[i].factor = num1[num1.size()-i-1]-'0'; sn1[i].power = i; } for (int i = 0; i < num2.size(); i++) { sn2[i].factor = num2[num2.size() - i - 1]-'0'; sn2[i].power = i; } //對兩個字串進行處理,即使是long long也沒法儲存,因此只能這樣 for (int i = 0; i < num1.size(); i++) { for (int j = 0; j < num2.size(); j++) { Node *p = new Node(); Node *b = new Node(); p->factor = sn1[i].factor*sn2[j].factor; p->power = sn1[i].power + sn2[j].power; if (p->factor / 10 > 0) { b->factor = p->factor / 10; b->power = p->power+1; p->factor = p->factor % 10; } if(result.size()==0||p->power>result[result.size() - 1].power) result.push_back(*p); else result[p->power].factor += p->factor;//可以直接使用索引 delete p;//釋放 if (b != NULL) { if (b->power>result[result.size() - 1].power) result.push_back(*b); else result[b->power].factor += b->factor; delete b; } } //每次走完一個內部迴圈,就重新調整一下 for (int i = 0; i < result.size() - 1; i++) {//先更改前面的 if (result[i].factor >= 10) { result[i + 1].factor += result[i].factor / 10; result[i].factor %= 10; } } if (result[result.size() - 1].factor >= 10) { Node *a = new Node(); a->factor = result[result.size() - 1].factor / 10; result[result.size() - 1].factor %= 10; a->power = result.size(); result.push_back(*a); delete a; } } //接下來開始對result進行轉化 for (int i = result.size() - 1; i >= 0; i--) { s += result[i].factor+'0'; } return s; } }; int main() { string num1, num2;//設定兩個字串 cin >> num1 >> num2;//輸入 Solution bb; string s = bb.multiply(num1,num2); cout<<s<<endl; return 0; }