系列综述:
目的:本系列是个人整理为了秋招面试
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢!!!
【C++】秋招&实习面经汇总篇
点此到文末惊喜↩︎
auto cmp = [&](const int& a, const int &b) {
return cnt[a] < cnt[b];//此处cnt可由上文完成定义(最大堆--跟sort正好相反)
};
priority_queue<int, vector<int>, decltype(cmp)>pq{cmp};
struct Program {
int p;
int c
Program(int profit, int cost) : p(profit), c(cost){}
}
int FindMaxProfits(vector<int> profits, vector<int> costs, int times, int surplus) {
// 比较最小花费
auto cmp_min_cost = [](const Program &a, const Program &b)->bool{
return a.c < b.c;
};
// 比较最大利润
auto cmp_max_profit = [](const Program &a, const Program &b)->bool{
return a.p > b.p;
};
// 关于花费的小根堆
priority_queue<Program , vector<Program>, decltype(cmp_min_cost)> min_cost_pq;
// 关于利润的大根堆
priority_queue<Program , vector<Program>, decltype(cmp_max_profit)> max_profit_pq;
// 将所有花费压入优先队列中
for (int i = 0; i < profits.size(); ++i) {
Program pg = {profits[i], costs[i]};
min_cost_pq.push(pg);
}
// 每次循环取出所有可支持的项目,并压入最大利润队列
for (int i = 0; i < times; ++i) {
while (!min_cost_pq.empty() && min_cost_pq.top().c <= surplus){
Program pg = min_cost_pq.top();
min_cost_pq.pop();
max_profit_pq.push(pg);
}
// 如果最大利润队列为空,说明没有符合的项目可以继续进行
if (max_profit_pq.empty()) {
return surplus;
}
// 获取最大利润
surplus += max_profit_pq.top().p;
max_profit_pq.pop();
}
}
#include
class DisjSet {
private:
vector<int> parent;
public:
DisjSet(int max_size) : parent(vector<int>(max_size)) {
// 各自为营:初始化每一个元素的根节点都为自身
for(int i = 0; i < max_size; i++)
parent[i] = i;
}
// 查找:没找到就一直递归查看父亲结点
int find(int x) {
return (parent[i] == x ? x : find(parent[i]);
}
// 合并:将 x1 所在的集合的根节点的父节点设置为 x2 所在集合的根节点
void to_union(int x1, int x2) {
parent[find(x1)] = find(x2);
}
// 判断两个元素是否属于同一个集合
bool is_same(int e1, int e2) {
return find(e1) == find(e2);
}
};
#include
class DisjSet {
private:
std::vector<int> parent;
std::vector<int> rank; // 秩
public:
DisjSet(int max_size) : parent(std::vector<int>(max_size)),
rank(std::vector<int>(max_size, 0)) {
for (int i = 0; i < max_size; ++i)
parent[i] = i;
}
int find(int x) {
return x == parent[x] ? x : (parent[x] = find(parent[x]));
}
void to_union(int x1, int x2) {
int f1 = find(x1);
int f2 = find(x2);
if (rank[f1] > rank[f2])
parent[f2] = f1;
else {
parent[f1] = f2;
if (rank[f1] == rank[f2])
++rank[f2];
}
}
bool is_same(int e1, int e2) {
return find(e1) == find(e2);
}
};
struct User {
string a;
string b;
string c;
User(string a1, string b1, string c1) : a(a1), b(b1), c(c1){}
};
点此跳转到首行↩︎