数据结构基础--蓝桥杯备考
1.优缺点总述
STL中各容器对比图
各类线性数据结构优缺点
1.数组
1.优点
1.简单,容易理解
2.访问快捷,只需要用下标就可以
3.有某些应用场景直接对应,例如二维数组对应平面
2.缺点
删除和插入数据非常耗时
2.链表
1.优点
插入和删除数据很便捷
2.缺点
定位数据比较耗时,要从链表头开始沿着指针一个一个走。
3.队列
有自己的使用场景,无优缺点
3.栈
有自己的使用场景,无优缺点
各类非线性数据结构优缺点
1.二叉树
2.哈希表
2.数组和高精度
1.大数组的使用
在大赛中经常用大数组,注意以下情况
1.建议不要用malloc()动态分配,因为动态分配需要多写代码而且容易出错。
2.大数组应该定义成全局静态数组,而且不需要初始化为零,因为全局变量在初始化时自动赋值为零。因为定义到函数内部,可能会导致栈溢出。
2.对各种存储域的补充
1.栈
存储局部变量和函数调用信息等,容量较小
2.堆
由malloc,calloc,realloc等分配,需要手动释放。
3.数据段
存放已经初始化的全局变量与静态变量
4.bss段
存放未初始化的全局变量或静态变量。这些变量会被自动初始化0或NULL。
3.高精度算法
在计算机科学中,标准的数据类型如整型(int)、长整型(long)(long long)等都有其表示范围的限制。当需要处理比这些类型所能表示的范围更大的数字时,就需要使用高精度算法。
高精度算法这个过程类似于我们在学校里学习的手工算数,将数的每一位都存入数组,从最低位开始逐位处理,并处理进位。
除了C语言的静态数组,还可以用vector来定义大数组
1.代码演示高精度加法
#include<iostream>
using namespace std;
char a[1005],b[1005];//1005是防止有进位
string fun(string as, string bs)
{//注意不能写到主函数内,要写成子函数,因为a和b目前是指针类型,不能使用sizestring ss;//返回值int lmax;//两数组最长长度int lena = as.size(), lenb = bs.size();//长度for(int i=0;i<lena;i++){a[lena - i - 1] = as[i] - '0';}for (int i = 0; i < lenb; i++){b[lenb - i - 1] = bs[i] - '0';}lmax = lena > lenb ? lena:lenb;for (int i = 0; i < lmax; i++){//这样就不用区分那个数字较大了a[i] += b[i];a[i + 1] += a[i] / 10;a[i] %= 10;}if (a[lmax])//如果非零,则有进位{lmax++;}for (int i = lmax - 1; i >= 0; i--){ss += a[i] + '0';//将数字转化成字符,并且反转}return ss;
}
int main()
{string as, bs;cin >> as;cin >> bs;cout << fun(as,bs) << endl;return 0;
}
2.代码演示高精度减法
3.STL概述
1.string库
语法详情见STL-string容器
案例1
1.题目
问题描述
在烬寂海中居住着某种智慧生物。它们的文明发展程度相当于地球上的中世纪,但是它们拥有强大的科技与魔法。
一天,王国的法师得到了一段古老的魔法咒文,咒文中似乎隐藏着巨大的能量,但是咒文中有很多相似的字符串片段,法师们相信这些片段与魔法的启动有关。
现在,国王决定招募聪明的你,使用你的技术能力来帮助法师们解开这个谜团。
现在给你一个字符串 SS(主串),还有若干个模式串 PP。你需要统计每一个模式串在主串中出现的次数。
输入格式
第一行:一个字符串 SS,表示主串,只包含小写英文字母。
第二行:一个整数 nn,表示有 nn 个模式串。
接下来的 nn 行:每行一个字符串,代表一个模式串 PP,只包含小写英文字母。
输出格式
nn 行,每行一个整数,表示对应模式串在主串中出现的次数。
样例输入
bluemooninthedarkmoon 3 moon blue dark
样例输出
2 1 1
测评数据规模
主串的长度:∣S∣≤1×105∣S∣≤1×105。
模式串的数量:1≤n≤1001≤n≤100。
模式串的长度:∣P∣≤1000∣P∣≤1000。
运行限制
语言 最大运行时间 最大运行内存 C++ 3s 128M C 3s 128M Java 5s 128M Python3 7s 128M PyPy3 7s 128M Go 7s 128M JavaScript 7s 128M
2.作答(第一版)
#include <bits/stdc++.h>
using namespace std;
int main()
{// 请在此输入您的代码string s;cin >> s;int n;cin >> n;int sumz[200]={0};for (int i = 0; i < n; i++){string p;int posint = 0;int sum = 0;cin >> p;while (s.find(p,posint) != -1){sum++;posint = s.find(p,posint);posint += p.size();}sumz[i] = sum;}for (int i = 0; i < n; i++){cout << sumz[i] << endl;}return 0;
}
这一版只能通过百分之八十的案例,因为在第二十一行代码没有考虑到S为“aaaa”,P为“aa”,这样aa根据posint+=p.size();的话只能计数两次,应该改为posint++;这样就可以计数三次。
第二个问题是使用了静态数组sumz,浪费了空间,应该使用动态数组vector来节省空间。
3.作答(第二版)
#include <iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{// 请在此输入您的代码string s;cin >> s;int n;cin >> n;vector<int> sumz;for (int i = 0; i < n; i++){string p;int posint = 0;int sum = 0;cin >> p;while (s.find(p,posint) != -1){sum++;posint = s.find(p,posint);posint ++;}sumz.push_back(sum);}for (int i = 0; i < n; i++){cout << sumz[i] << endl;}return 0;
}
4.官方题解
#include <iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{string s;int n;vector<int> sum;cin >> s >> n;int n1 = n;while (n--){string p;cin >> p;int cnt = 0;for (int i = 0; i < s.length() - p.length() + 1; i++){if (p == s.substr(i, p.length()))cnt++;}sum.push_back(cnt);}for (int i = 0; i < n1; i++){cout << sum[i] << endl;}return 0;
}
使用了暴力算法
i < s.length() - p.length() + 1
的含义
这里的条件是
i < s.length() - p.length() + 1
。
s.length()
是主字符串s
的长度,p.length()
是子字符串p
的长度。
s.length() - p.length() + 1
表示的是主字符串中最后一个可能与子字符串匹配的起始位置。
4.比较
时间复杂度比较
官方题解:
- 外层循环执行
n
次(每个子字符串p
都需要处理一次)。- 内层循环的次数为
s.length() - p.length() + 1
,每次调用substr
提取子串并进行比较。- 假设主字符串
s
的长度为m
,子字符串p
的平均长度为k
,则内层循环的时间复杂度为 O(m⋅k)O(m⋅k)。- 总时间复杂度为:O(n⋅m⋅k)O(n⋅m⋅k)。
第二版:
- 外层循环同样执行
n
次。- 内层使用
find
函数查找子字符串的位置。find
函数在最坏情况下需要扫描整个主字符串s
,其时间复杂度为 O(m)O(m)。- 如果子字符串匹配多次,
find
会被调用多次,但总体上不会超过m
次。- 总时间复杂度为:O(n⋅m)O(n⋅m)。
结果
- 官方题解的时间复杂度为 O(n⋅m⋅k)O(n⋅m⋅k)。
- 第二版的时间复杂度为 O(n⋅m)O(n⋅m)。
因此,第二段代码的时间复杂度更低,效率更高。
案例2
1.题目
元音大写
问题描述
输入一个由小写英文字母组成的字符串,请将其中的元音字母 (a,e,i,o,u)(a,e,i,o,u) 转换成大写,其它字母仍然保持小写。
输入格式
输入一行包含一个字符串。
输出格式
输出转换后的字符串。
样例输入
lanqiao
样例输出
lAnqIAO
评测用例规模与约定
对于所有评测用例,字符串的长度不超过 100100。
2.作答
#include <bits/stdc++.h>
using namespace std;
int main()
{// 请在此输入您的代码string s;cin >> s;for (int i = 0; i < s.size(); i++){if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u'){s[i] -= 32;}}cout << s << endl;return 0;
}
3.解答
题目设计数据限制较小直接用暴力即可。
2.迭代器
1.auto
补充:auto可以自动推导数据类型。
auto
关键字是 C++11 引入的一个非常有用的特性,它允许编译器自动推导变量的类型。使用auto
可以简化代码,尤其是在处理复杂类型(如迭代器、模板实例化类型等)时。下面详细介绍auto
的用法及其适用场景。基本用法
当你声明一个变量并初始化它时,可以使用
auto
来让编译器根据初始化表达式的类型自动推导出变量的类型。示例 1:基础类型
auto x = 5; // x 是 int 类型 auto y = 3.14; // y 是 double 类型 auto z = 'a'; // z 是 char 类型 auto str = "Hello"; // str 是 const char* 类型
示例 2:复杂类型
std::vector<int> vec = {1, 2, 3, 4}; auto it = vec.begin(); // it 是 std::vector<int>::iterator 类型
auto
结合引用和指针
auto
还可以与引用和指针结合使用,但需要注意的是,auto
默认不会推导出引用或指针类型。如果你希望得到引用或指针类型的变量,需要显式指定。示例 3:引用
int a = 10; auto b = a; // b 是 int 类型,值为 10 auto& c = a; // c 是 int& 类型,它是 a 的引用 c = 20; // 修改 c 实际上修改了 a std::cout << a << std::endl; // 输出 20
示例 4:指针
cpp
深色版本
int x = 10; auto p = &x; // p 是 int* 类型,指向 x *p = 20; // 修改 x 的值 std::cout << x << std::endl; // 输出 20
auto
结合常量当初始化表达式是一个常量时,
auto
推导出的类型也会是一个常量类型。示例 5:常量
cpp
深色版本
const int ci = 10; auto aci = ci; // aci 是 int 类型,而不是 const int const auto caci = ci; // caci 是 const int 类型
auto
结合模板在模板编程中,
auto
可以极大地简化代码,特别是在定义模板函数返回类型或模板参数类型时。示例 6:模板中的
auto
cpp
深色版本
template <typename T> auto get_value(T t) -> decltype(t + 1) {return t + 1; }
auto
在范围循环中的应用
auto
在范围循环中特别有用,它可以让你轻松遍历容器中的元素,而无需显式声明迭代器类型。示例 7:范围循环
cpp
深色版本
std::vector<int> vec = {1, 2, 3, 4, 5};// 使用 auto 遍历 vector 中的每个元素 for (auto elem : vec) {std::cout << elem << " "; // 输出 1 2 3 4 5 } std::cout << std::endl;// 如果你想要修改元素,可以使用引用 for (auto& elem : vec) {elem *= 2; // 将每个元素乘以 2 }for (auto elem : vec) {std::cout << elem << " "; // 输出 2 4 6 8 10 } std::cout << std::endl;
注意事项
类型推导规则:
auto
会忽略顶层const
和引用,因此你需要显式添加它们。例如,
auto x = 5;
推导出int
而不是const int
或int&
。复合类型:
对于复合类型(如数组、函数指针等),直接使用
auto
可能会导致意外的结果。可以使用
decltype
辅助进行更复杂的类型推导。调试和可读性:
虽然
auto
可以减少重复代码,但在某些情况下可能会影响代码的可读性。确保使用auto
不会降低代码的理解难度。总结
auto
是一个强大的工具,用于简化代码并提高开发效率。它可以自动推导变量的类型,尤其适用于复杂类型或模板编程。
注意使用
auto
时要理解其推导规则,并在必要时显式指定引用或指针类型,以避免潜在的错误
#include <iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{vector<int> s;s.push_back(1);s.push_back(2);s.push_back(3);s.push_back(4);s.push_back(5);s.push_back(6);auto it = s.begin();it += 5;cout << *it << endl;return 0;
}
目前蓝桥杯支持C++11标准库,支持auto关键字
3.容器
1.各个容器对比图
对比图
2.vector
vector详解
3.set
set详解
4.map
map详解
5.链表
1.手搓单链表
此次使用数组模拟静态链表,即逻辑上是链表,物理上是数组
#include<stdio.h>
using namespace std;
#include<iostream>
const int N = 10000;
struct cll
{int id;int data;int nextid;
}nodes[N];//nodes是结点的复数
int main()
{int n = 5;//构造链表nodes[0].id = 0;//显式赋值,将代码更加可视化。吐过不添加这串代码也没事,因为头节点会被隐式赋值,会自动赋值为0。nodes[0].nextid = 1;for (int i = 1; i <= n; i++){nodes[i].id = i;nodes[i].nextid = i + 1;nodes[i].data = i * 10;}//定义为循环链表,尾指向头nodes[n].nextid = nodes[0].nextid;//删除链表节点cout << "是否删除" << endl;int bool1 = 0;cin >> bool1;if (bool1 == 1){int nowid = 0;cout << "删除" << endl;cin >> nowid;//输入当前节点位置nodes[nowid - 1].nextid = nowid + 1;//定义为循环链表,尾指向头nodes[n].nextid = nodes[0].nextid;}//插入链表节点cout << "是否插入" << endl;int bool2 = 0;cin >> bool2;if (bool2 == 1){cout << "插入位置" << endl;int n1 = n;int insert = 0;cin >> insert;nodes[++n1].id = n1;nodes[n1].data = 666;nodes[n1].nextid = nodes[insert].nextid;nodes[insert].nextid = nodes[n1].id;if (insert == 0){//定义为循环链表,尾指向头nodes[n].nextid = nodes[0].nextid;}}//遍历链表int current = nodes[0].nextid; // 从第一个数据节点开始do {printf("Node ID: %d, Data: %d\n", nodes[current].id, nodes[current].data);current = nodes[current].nextid; // 移动到下一个节点} while (current != nodes[0].nextid);
}
对于插入操作中判断isnert==0的操作,是为了防止破坏链表结构
不更新链表结构的话,会导致无限循环
2.单链表题目
小王子单链表
题目描述
小王子有一天迷上了排队的游戏,桌子上有标号为 1−101−10 的 1010 个玩具,现在小王子将他们排成一列,可小王子还是太小了,他不确定他到底想把那个玩具摆在哪里,直到最后才能排成一条直线,求玩具的编号。已知他排了 MM 次,每次都是选取标号为 XX 个放到最前面,求每次排完后玩具的编号序列。
要求一:采用单链表解决
输入描述
第一行是一个整数 MM,表示小王子排玩具的次数。
随后 MM 行每行包含一个整数 XX,表示小王子要把编号为 XX 的玩具放在最前面。
输出描述
共 MM 行,第 ii 行输出小王子第 ii 次排完序后玩具的编号序列。
输入输出样例
示例 1
输入
5 3 2 3 4 2
输出
3 1 2 4 5 6 7 8 9 10 2 3 1 4 5 6 7 8 9 10 3 2 1 4 5 6 7 8 9 10 4 3 2 1 5 6 7 8 9 10 2 4 3 1 5 6 7 8 9 10
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
本题的解题思路是先删除再插入,不过由于是单链表,需要通过一个遍历算法算得到前面的节点id
3.手搓双向链表
#include<stdio.h>
using namespace std;
#include<iostream>
const int N = 10000;
struct cll
{int id;int data;int preid;int nextid;
}nodes[N];//nodes是结点的复数
int main()
{int n = 5;//构造链表nodes[0].id = 0;//显式赋值,将代码更加可视化。吐过不添加这串代码也没事,因为头节点会被隐式赋值,会自动赋值为0。nodes[0].nextid = 1;for (int i = 1; i <= n; i++){nodes[i].preid = i - 1;nodes[i].id = i;nodes[i].nextid = i + 1;nodes[i].data = i * 10;}//定义为循环链表,尾指向头nodes[n].nextid = nodes[0].nextid;//删除链表节点cout << "是否删除" << endl;int bool1 = 0;cin >> bool1;if (bool1 == 1){int nowid = 0;cout << "删除" << endl;cin >> nowid;//输入当前节点位置nodes[nowid - 1].nextid = nowid + 1;nodes[nowid + 1].preid = nodes[nowid - 1].id;//定义为循环链表,尾指向头nodes[n].nextid = nodes[0].nextid;}//插入链表节点cout << "是否插入" << endl;int bool2 = 0;cin >> bool2;if (bool2 == 1){cout << "插入位置" << endl;int n1 = n;int insert = 0;cin >> insert;nodes[++n1].id = n1;nodes[n1].data = 666;nodes[n1].preid = nodes[insert].id;nodes[n1].nextid = nodes[insert].nextid;nodes[insert].nextid = nodes[n1].id;if (insert == 0){//定义为循环链表,尾指向头nodes[n].nextid = nodes[0].nextid;}}//遍历链表int current = nodes[0].nextid; // 从第一个数据节点开始do {printf("Node ID: %d, Data: %d\n", nodes[current].id, nodes[current].data);current = nodes[current].nextid; // 移动到下一个节点} while (current != nodes[0].nextid);
}
4.极简链表
适合于单一场景,节点即值,值即节点
5.STL的list
list详解
1.list解决上面单链表题目
#include <iostream>
#include<list>
using namespace std;
const int n = 1000;
int main()
{list <int> toy{1,2,3,4,5,6,7,8,9,10};int m;int x;cin>>m;while(m--){cin>>x;toy.remove(x);toy.push_front(x);for(auto i:toy){cout<<i<<" ";}cout<<endl;}return 0;
}
2.list例题2
问题描述
给定按从小到大的顺序排列的数字 11 到 nn,随后对它们进行 mm 次操作,每次将一个数字 xx 移动到数字 yy 之前或之后。请输出完成这 mm 次操作后它们的顺序。
输入格式
第一行为两个数字 n,mn,m,表示初始状态为 11 到 nn 的从小到大排列,后续有 mm 次操作。
第二行到第 m+1m+1 行,每行三个数 x,y,zx,y,z。当 z=0z=0 时,将 xx 移动到 yy 之后;当 z=1z=1 时,将x移动到 yy 之前。
输出格式
一行,nn 个数字,中间用空格隔开,表示 mm 次操作完成后的排列顺序。
样例输入样例输出
2 1 3 5 4
说明/提示
n≤1e4n≤1e4,m≤1e4m≤1e4。
运行限制
语言 最大运行时间 最大运行内存 C++ 1s 256M C 1s 256M Java 2s 256M Python3 3s 256M PyPy3 3s 256M Go 3s 256M JavaScript 3s 256M
#include <iostream> #include<list> #include<algorithm> using namespace std; int main() {// 请在此输入您的代码list<int>cll;int n, m, x, y, z;cin >> n >> m;for (int i = 1; i <= n; i++){cll.push_back(i);}for (int i = 1; i <= m; i++){cin >> x >> y >> z;cll.remove(x);auto it = find(cll.begin(), cll.end(), y);if (z == 0){cll.insert(++it, x);}else if (z == 1){cll.insert(it, x);}}for (auto i : cll){cout << i << " ";}cout << endl;return 0; }
6.队列
队列是一种先进先出的数据结构
1.手写队列
#include<iostream>
using namespace std;
const int N = 10000;
struct myqueue
{int a[N];//定义队列int head = 0;//对头int tail = -1;//队尾int size(){return tail - head + 1;}void push(int data)//入队{a[++tail] = data;}int front()//读队头{return a[head];}void pop()//弹出队头,不过注意保持head<=tail{if(head<=tail)head++;else{cout << "弹出失败" << endl;}}
};
int main()
{}
这种写法有一个缺陷:如果进入队列的数据太多,导致tail超过了N,会导致数组溢出,导致出错,通过循环队列可以解决这个问题。
2.手写队列例题
题目描述
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n−1 名小朋友,而该题是全部出圈。
输入格式
输入两个整数 n,m。
输出格式
输出一行 n 个整数,按顺序输出每个出圈人的编号。
输入输出样例
输入 #1复制
10 3输出 #1复制
3 6 9 2 7 1 8 5 10 4说明/提示
1≤m,n≤100
#include<iostream>
using namespace std;
const int N = 10000;
struct myqueue
{int a[N];//定义队列int head = 0;//对头int tail = -1;//队尾int size(){return tail - head + 1;}void push(int data)//入队{a[++tail] = data;}int front()//读队头{return a[head];}void pop()//弹出队头,不过注意保持head<=tail{if(head<=tail)head++;else{cout << "弹出失败" << endl;}}
};
myqueue que;
int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; i++)//队列赋值{que.push(i);}while (que.size() != 0){for (int i = 1; i < m; i++){que.push(que.front());que.pop();}cout << que.front() << " ";que.pop();}cout << endl;return 0;
}
就是不断更新队头的位置,通过删除队头来解决问题
2.STL中的queue
queue详解
相关文章:

数据结构基础--蓝桥杯备考
1.优缺点总述 STL中各容器对比图 各类线性数据结构优缺点 1.数组 1.优点 1.简单,容易理解 2.访问快捷,只需要用下标就可以 3.有某些应用场景直接对应,例如二维数组对应平面 2.缺点 删除和插入数据非常耗时 2.链表 1.优点 插入和删…...

2.4GHz无线通信芯片选型指南:集成SOC与低功耗方案解析
今天给大家分享几款2.4GHz无线通信芯片方案: 一、集成SOC芯片方案 XL2407P(芯岭技术) 集成射频收发机和微控制器(如九齐NY8A054E) 支持一对多组网和自动重传 发射功率8dBm,接收灵敏度-96.5dBm(…...
安卓刷机模式详解:Fastboot、Fastbootd、9008与MTK深刷
安卓刷机模式详解:Fastboot、Fastbootd、9008与MTK深刷 一、刷机模式对比 1. Fastboot模式 简介:传统安卓底层刷机模式,通过USB连接电脑操作优点:支持大多数安卓设备,操作相对简单缺点:需要设备进入特定…...

Unity_JK框架【5】音效系统实现
在游戏开发中,音频是不可或缺的一部分,它能够极大地增强游戏的沉浸感和趣味性。今天,我们就用JK框架 探讨一下如何在Unity中实现一个强大的音频系统,并且通过实际的测试脚本来验证其功能👏。 一、音频模块类࿱…...

鸿蒙 从打开一个新窗口到Stage模型的UIAbility组件
打开一个新的窗口 我们首先来实现如何在一个应用中打开一个新窗口,使用的模型是 Stage 模型 在项目文件里,新建一个 newWindow.ets 新文件 src/main/ets/pages/newWindow.ets newWindow.ets文件里面随便写点什么都行,这里是第一步创建的文件…...
MySQL数据库——视图
目录 一、视图是什么? 二、特点 三、创建视图 四.查询视图 五.更新视图 六.视图的作用 总结 一、视图是什么? 视图是从一个或多个表中导出的虚拟表,它本身不存储数据,而是基于 SQL 查询的结果集。 二、特点 1.虚拟性࿱…...
redis数据结构-09 (ZADD、ZRANGE、ZRANK)
Redis 排序集简介:ZADD、ZRANGE、ZRANK Redis 有序集合是一种功能强大的数据结构,兼具集合和哈希的特性。它维护一组唯一元素,类似于集合;但每个元素都与一个分数相关联,类似于哈希。分数用于对有序集合中的元素进行排…...
PyTorch API 1 - 概述、数学运算、nn、实用工具、函数、张量
文章目录 torch张量创建操作索引、切片、连接与变异操作 加速器生成器随机采样原地随机采样准随机采样 序列化并行计算局部禁用梯度计算数学运算常量逐点运算归约操作比较运算频谱操作其他操作BLAS 和 LAPACK 运算遍历操作遍历操作遍历操作遍历操作遍历操作遍历操作遍历操作遍历…...

长短期记忆网络(LSTM)深度解析:理论、技术与应用全景
长短期记忆网络(LSTM)作为循环神经网络(RNN)的重要变体,通过门控机制有效解决了传统RNN的梯度消失问题,成为时序数据处理的核心技术。本文从理论起源、数学建模、网络架构、工程实现到行业应用,…...

c语言第一个小游戏:贪吃蛇小游戏02
接上文继续学习 ncurse的上下左右键获取 想要使用ncurse的功能键,也就是键盘快捷键,不是q、r、t,是 上下左右、F1、F2等等的键,我们叫做功能键要是想用这些功能键需要使用keypad函数 Keypad(stdscr,1); 从stdscr接收标准中&…...
【Python爬虫 !!!!!!政府招投标数据爬虫项目--医疗实例项目文档(提供源码!!!)!!!学会Python爬虫轻松赚外快】
政府招投标数据爬虫项目--医疗实例项目文档 1. 项目概述1.1 项目目标1.2 技术栈 2. 系统架构2.1 模块划分2.2 流程示意图 3. 核心模块设计3.1 反爬处理模块(utils/anti_crawler.py)3.1.1 功能特性3.1.2 关键代码 3.2 爬虫模块(crawler/spider…...

Android架构之自定义native进程
在Android五层架构中,native层基本上全是c的世界,这些c进程基本上靠android世界的第一个进程init进程创建,init通过rc配置文件,创建了众多的c子进程,也是这众多的c进程,构建了整个android世界的native层。 …...
talk-centos6之间实现
在 CentOS 6.4 上配置和使用 talk 工具,需要注意系统版本较老,很多配置可能不同于现代系统。我会提供 详细步骤 自动化脚本,帮你在两台 CentOS 6.4 机器上实现局域网聊天。 ⸻ 🧱 一、系统准备 假设你有两台主机: …...

《100天精通Python——基础篇 2025 第18天:正则表达式入门实战,解锁字符串处理的魔法力量》
目录 一、认识正则表达式二、正则表达式基本语法2.1 行界定符2.2 单词定界符2.3 字符类2.4 选择符2.5 范围符2.6 排除符2.7 限定符2.8 任意字符2.9 转义字符2.10 反斜杠2.11 小括号2.11.1 定义独立单元2.11.2 分组 2.12 反向引用2.13 特殊构造2.14 匹配模式 三、re模块3.1 comp…...
数组中元素如何交换与打乱
1 问题 在本周学习了java基础语法中的数组,在学习数组后,我们会遇到关于数组中元素的倒序,交换,和无序打乱等问题,在Python中我们可以用list的方法进行元素倒序,那么我们在java中应该如何实现数组用元素的倒序和元素的打乱呢? 2 方法 使用循环,Random类,下标索引实现 关于元素…...

Nuitka 已不再安全? Nuitka/Cython 打包应用逆向工具 -- pymodhook
pymodhook是一个记录任意对Python模块的调用的库,用于Python逆向分析。 pymodhook库类似于Android的xposed框架,但不仅能记录函数的调用参数和返回值,还能记录模块的类的任意方法调用,以及任意派生对象的访问,基于pyob…...

【C】初阶数据结构14 -- 归并排序
本篇文章主要是讲解经典的排序算法 -- 归并排序 目录 1 递归版本的归并排序 1) 算法思想 2) 代码 3) 时间复杂度与空间复杂度分析 (1) 时间复杂度 (2) 空间复杂度 2 迭代版本的归并…...

华为网路设备学习-21 IGP路由专题-路由过滤(filter-policy)
一、路由过滤(filter-policy) 1、用于控制路由更新、接收的一个工具 2、只能过滤路由信息,无法过滤LSA 二、路由过滤(filter-policy)与动态路由协议 1、距离矢量路由协议 RIP动态路由协议 交换的是路由表࿰…...
NestJS 框架深度解析
框架功能分析 NestJS 是一个基于 Node.js 的渐进式框架,专为构建高效、可扩展的服务器端应用程序而设计。其核心理念结合了 面向对象编程(OOP)、函数式编程(FP) 和 函数式响应式编程(FRP)&…...
人脸识别门禁系统技术文档
人脸识别门禁系统技术文档 序言 本文档详细描述了人脸识别门禁系统的技术实现原理与方法。该系统旨在提供高安全性的门禁管理解决方案,通过先进的人脸识别技术,实现无接触式身份验证,提高安全管理效率。 系统整合了人工智能与计算机视觉技…...

SAP 交货单行项目含税金额计算报cx_sy_zerodivide处理
业务背景:SAP交货单只有数量,没有金额,所以开发报表从订单的价格按数量计算交货单的金额。 用户反馈近期报表出现异常: ****2012/12/12 清风雅雨 规格变更 Chg 修改开始 ** 修改原因:由于余数为0时,可能会报错溢出。…...

【Qt】之音视频编程1:QtAV的背景和安装篇
QtAV 背景与核心概念 1. 什么是 QtAV? QtAV 是一个基于 Qt 框架 和 FFmpeg 的多媒体播放库,旨在为 Qt 应用程序提供高性能、跨平台的音视频播放、处理及渲染功能。它封装了 FFmpeg 的底层编解码能力,并通过 Qt 的图形系统(如 QM…...

算法与数据结构 - 二叉树结构入门
目录 1. 普通二叉树结构 1.1. 常见术语 1.2. 完全二叉树 (Complete Binary Tree) 1.3. 满二叉树 (Full Binary Tree) 2. 特殊二叉树结构 2.1. 二叉搜索树 (BST) 2.1.1. BST 基本操作 - 查找 2.1.2. BST 基本操作 - 插入 2.1.3. BST 基本操作 - 删除 2.2. 平衡二叉树…...

如何使用远程桌面控制电脑
目的: 通过路由器使用pc控制台式机,实现了有线/无线pc与台式机的双向远程桌面控制 最核心就两条:get ip地址与被控制机器的账户与密码。 现象挺神奇:被控制电脑的电脑桌面处于休眠模式,此时强行唤醒被控电脑会导致中断…...

SpringMVC-执行流程
目录 前言 一、SpringMVC执行流程 SpringMVC 主要组件 SpringMVC 的执行流程 简要分析执行流程 总结 前言 理解SpringMVC的执行流程是学习SpringMVC工作原理的重要一步。 项目内容参考:SpringMVC-简介及入门-CSDN博客 一、SpringMVC执行流程 SpringMVC 主要组…...

计算机网络网络层(下)
一、互联的路由选择协议(网络层控制层面内容) (一)有关路由选择协议的几个概念 1.理想的路由算法 (1)理想路由算法应具备的特点:算法必须正确和完整的,算法在计算上应简单&#x…...

深入学习Zookeeper的知识体系
目录 1、介绍 1.1、CAP 理论 1.2、BASE 理论 1.3、一致性协议ZAB 1、介绍 2、角色 3、ZXID和myid 4、 历史队列 5、协议模式 6、崩溃恢复模式 7、脑裂问题 2、zookeeper 2.1、开源项目 2.2、功能 2.3、选举机制 3、数据模型 3.1、介绍 3.2、znode分类 4、监听…...
主从架构:技术原理与实现
一.简单介绍分布式锁的复习 今天在一个分布式锁的视频讲解中,提到了主从架构,所以有了这篇文章。 当然我们可以先说说分布式锁,可以使用redis的setnxlua脚本实现,或者也可以用redission实现,或者看门狗机制。 由看门…...
大模型核心运行机制
大模型核心运行机制目录 一、核心架构:Transformer的演进与改进1.1 核心组件包括:1.1.1 自注意力机制(Self-Attention)1.1.2 多头注意力(Multi-Head Attention)1.1.3 位置编码(Positional Encod…...

uniapp跨平台开发HarmonyOS NEXT应用初体验
之前写过使用uniapp开发鸿蒙应用的教程,简单介绍了如何配置开发环境和运行项目。那时候的HbuilderX还是4.22版本,小一年过去了HbuilderX的正式版本已经来到4.64,历经了多个版本的更新后,跨平台开发鸿蒙应用的体验大幅提升。今天再…...