1. 程式人生 > >9.18(40. 組合總和 II 43.字串相乘)

9.18(40. 組合總和 II 43.字串相乘)

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;
}