系列综述:
目的:本系列是个人整理为了秋招面试
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢!!!
【C++】秋招&实习面经汇总篇
点此到文末惊喜↩︎
x
字符作为前缀的数量struct Node{
int pass; // 该结点的通过数
int end; // 以该结点为结尾的结尾数
vector<int> *nexts; // 如果字符过多可使用unordered_map nexts
Node(){
pass = 0;
end = 0;
next = new vector<Node>(26);
}
};
class Trie{
public:
Trie(){
root = new Node();
}
void insert(string str) {
// 健壮性检查
if (str.empty()) return ;
// 初始化
Node *node = root; // 获得根节点的引用
node->pass++; // 根节点被经过了,pass++
int path = 0; // 表示要走的路径
// 算法部分
for (int i = 0; i < str.size(); ++i) { // 遍历字符串
path = str[i] - 'a'; // 求出nexts中的下一个路径
// 无结点建立,有结点复用
if (node->nexts[path] == nullptr) {
node->nexts[path] = new Node();
}
node = node->nexts[path]; // 访问下一个
node->pass++; // 访问数+1
}
node->end++; // 结尾结点结尾数end++
}
int Search(string str) {
if (str.size() == 0) return 0;
Node *node = root;
int path = 0;
for (int i = 0; i < str.size(); ++i) {
// doing
path = str[i] - 'a';
if (node->nexts[path] == nullptr)
return 0;
// 迭代
node = node->next[path];
}
return node->end;
}
int TrieNumber(string prev) {
if (prev.empty()) return 0;
Node *node = root;
int path = 0;
for (int i = 0; i < prev.size(); ++i) {
path = prev[i] - 'a';
if (node->nexts[path] == nullptr)
return 0;
node = node->nexts[path];
}
return node->pass;
}
// java会自动释放,但是cpp有内存泄漏问题,需要使用shared_ptr进行处理
void DeleteTrie(string str) {
if (search(word) != 0) { // 有该字符串才能删除
Node *node = root;
int path = 0;
for (int i = 0; i < str.size(); ++i) {
if (--node->nexts[path].pass == 0) {
node.nexts[path] = nullptr;
// release
return ;
}
node = node->nexts[path];
}
node->end--;
}
}
private:
Node root;
};
点此跳转到首行↩︎