2022华为4.20笔试题 C++
- 回溯穷举
#include <iostream>
#include <vector>
using namespace std;
class Solution{
private:
vector<vector<int>> result;
vector<int> path;
vector<int> candidates;
vector<bool> used;
void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used){
if( isWrongMore3(used) ) return;
if(sum > target) return;
if(sum == target){
result.push_back(path);
return;
}
for(int i=startIndex; i<candidates.size(); i++){
used[i] = true;
sum += candidates[i];
path.push_back(candidates[i]);
backtracking(candidates, target, sum, i+1, used);
sum -= candidates[i];
path.pop_back();
used[i] = false;
}
}
void initCandidates(){
for(int i=0; i<10; i++) candidates.push_back(2);
for(int i=0; i<10; i++) candidates.push_back(4);
for(int i=0; i<5; i++) candidates.push_back(8);
for(int i=0; i<25; i++) used.push_back(false);
}
bool isWrongMore3(vector<bool>& used){
int wrongNums = 0;
vector<bool>::reverse_iterator it = used.rbegin();
while (it != used.rend()){
if(*it == 1) break;
++it;
}
while (it != used.rend()){
if(*it == 0) ++wrongNums;
if(wrongNums>=3) return true;
++it;
}
return false;
}
public:
int combinationSum(int target){
initCandidates();
backtracking(candidates, target, 0, 0, used);
return result.size();
}
};
int main()
{
int input;
cin >> input;
Solution instance;
int ret;
ret = instance.combinationSum(input);
cout << ret << endl;
return 0;
}
- 主要是通过数组构建二叉树
#include <iostream>
#include <vector>
#include <string.h>
#include <queue>
#include <sstream>
using namespace std;
class Solution {
struct treeNode {
int val;
treeNode* left = nullptr;
treeNode* right = nullptr;
treeNode(int val):val(val) {};
};
treeNode* buildTree(const vector<int>& vec) {
queue<treeNode*> que;
treeNode* root;
if (!vec.empty()) {
root = new treeNode(vec[0]);
que.push(root);
}
int idx = 1;
while (!que.empty() && idx < vec.size()) {
treeNode* cur = que.front();
que.pop();
if (vec[idx] != 0) {
cur->left = new treeNode(vec[idx]);
que.push(cur->left);
}
idx++;
if (vec[idx] != 0) {
cur->right = new treeNode(vec[idx]);
que.push(cur->right);
}
idx++;
}
return root;
}
void outputVec(treeNode* node) {
queue<treeNode*> que;
vector<int> numTree;
if (node != nullptr) que.push(node);
while (!que.empty()) {
treeNode* cur = que.front();
que.pop();
numTree.push_back(cur->val);
if(cur->left) que.push(cur->left);
if(cur->right) que.push(cur->right);
}
string outStr = "[";
for (int i = 0; i < numTree.size() - 1; i++) {
outStr = outStr + to_string(numTree[i]) + ',';
}
outStr = outStr + to_string(numTree[numTree.size() - 1]) + ']';
cout << outStr;
}
vector<int> stringSplit(const string& str, char delim) {
stringstream ss(str);
string item;
vector<int> elems;
while (getline(ss, item, delim)) {
if (!item.empty()) {
elems.push_back(atoi(item.c_str()));
}
}
return elems;
}
public:
void main() {
string master, path, slave;
cin >> master;
vector<int> masterTree;
masterTree = stringSplit(master.substr(1, master.size() - 2), ',');
treeNode* mTree = buildTree(masterTree);
cin >> path;
vector<int> treePath;
treePath = stringSplit(path.substr(1, path.size() - 1), '/');
cin >> slave;
vector<int> slaveTree;
slaveTree = stringSplit(slave.substr(1, slave.size() - 2), ',');
treeNode* sTree = buildTree(slaveTree);
treeNode* cur = mTree;
for (int i = 1; i < treePath.size() - 1; i++) {
if (cur->left->val == treePath[i]) cur = cur->left;
else cur = cur->right;
}
if (cur->left->val == treePath[treePath.size() - 1]) cur->left = sTree;
else cur->right = sTree;
outputVec(mTree);
}
};
int main(){
Solution instance;
instance.main();
return 0;
}