You are on page 1of 9

1.

数字 a 转字符串:string str = to_string(a);


2. 判断字符串是否为空:string str; str,empty(); 为空则返回 true,
3. string 中 find()返回值是字母在字符串中的位置(下标记录),如果没有找到,那么会返
回一个特别的标记 npos。string str, 没找到则返回 str.npos
PS:find 也可以查找字符串字串,比如想判断 a 是否包含 b,则 if(a.find(b) != -1) cout <<
s << endl;
4. 读取带空格的字符串时用 getline(cin, str);
5. string 中的 substr 用法,形式:s.substr(pos, n),返回一个 string,包含 s 中从 pos 开始的 n
个字符的拷贝
6. int 转 double 可能会有精度问题,可以加上 1e-8
7. 将 string 快速转换为小写:
string a; for(auto& c : a) c = tolower(c);
8. 判断 a,b 两个数是否合法,首先用%s 读入,然后用 sscanf+sprintf,
sscanf(const char *buffer , const char *format , [argument ]...); 从一个字符串中读进与指定格式
相符的数据的函数,即 sscanf 会从 buffer 里读取数据,依照 format 的格式将数据写入到
argument 里
int sprintf(char *str, const char *format, ...) 发送格式化输出到 str 所指向的字符串

参数说明:
buffer 为存储的数据
format 为格式控制字符串
argument 选择性设定字符串
9. 小写字母转化成大写子母 toupper()
10. 将字符串转换为十进制数字 stoi(string str)
11. 进制转换:
// 转化为 d 进制,并且逆序
string to_d(int n, int d){
string result;
while(n){
result += n % d + '0';
n /= d;
}
// reverse(result.begin(), result.end());
return result;
}

// 将 b 进制转换为 10 进制
int to_ten(string num, int b){
int res = 0;
for(int i = 0; i < num.size(); i++){
res = res * b + num[i] - '0';
}
return res;
}
11. C++中的读写优化:ios::sync_with_stdio(false);
12. 如果图论问题,变量为 string,可以映射成 int
13. 哈希表的几种方法:拉链法、开放寻址法
14. 骗分技巧,数据太大:
long double 的数据范围是:16*8 = 128 位,
long long 的数据范围是:8 * 8 = 64 位
15. 求图的最短路路径的时候,是从终点到起点逆序遍历
for(int i = END; I != START; i = pre[i]) path.push_back(i);
16. 开启 O2 或 O3 优化:
#pragma GCC optimize(2)
#pragma GCC optimize(3)
17. 计数问题:统计每一位中出现该数字的次数
18. 找两个数的最大公约数(辗转相除法):
LL gcd(LL a, LL b){
return b ? gcd(b, a % b) : a;
}
19. printf(“%Lf”) 用于输出 long double
20. 动态的维护一个集合的中位数,可以用对顶堆(用平衡树来实现)。
使用 multiset<type>,和 set 的区别是,multiset 不去重
21. 字符串添加 n 个 0:string str; str += string(n, ‘0’);
22. 求字符串的公共后缀
23. 中文读数字:1 2345 6789,分成三部分,第一部分后面加“Yi”;第二部分后面
加“万”,第三部分后面什么也不加。并 i 企鹅最多只能来纳许读一个零,100080,读
Yi Shi Wan Ling ba Shi;末尾不含 0,即不读末尾 0;
24. 树的重心:每次 dfs 可以确定以 u 为重心的最大连通块的节点数,并且更新一下
ans
25. 获得拓扑排序:将度为 0 的节点加入到队列中,然后 bfs 一下与之相连的所有点。
26. 找无向图最深的根:为了防止重复遍历,dfs 的时候带着父节点
最短路

朴素 Dijkstra 算法——O(n^2):

思路:即进行 n 次迭代去确定每个点到起点的最小值,最后输出的

终点的即为我们要找的最短路的距离。
堆优化版 dijkstra 适合稀疏图
思路:
在朴素版 dijkstra 中时间复杂度最高的寻找距离最短的点 O(n^2)可以使用最小堆
优化。
1. 一号点的距离初始化为零,其他点初始化成无穷大。
2. 将一号点放入堆中。
3. 不断循环,直到堆空。每一次循环中执行的操作为:
弹出堆顶(与朴素版 diijkstra 找到 S 外距离最短的点相同,并标记该点的最
短路径已经确定)。
用该点更新临界点的距离,若更新成功就加入到堆中。
Bellman-fold 算法
spfa 算法

spfa 不能求最短路的数量,但是可以求最短路的最大值

floyd 算法
最小生成树
朴素 Prim 算法

Kruskal 算法
染色法——判断是否是二分图

匈牙利算法——求二分图的最大匹配

图论:

1. 哈密顿回路

记录刷题:
第一章(字符串处理):完成
第二章(高精度):完成
第三章(进位制):完成
第四章(排序):完成
第五章(树):1605 二叉搜索树最后两层节点数量。1~13 完成,
第六章(图论): 1562
第七章(数学):完成
第九章(哈希表):完成
第十章(并查集):完成
第十一章(模拟):完成
第十二章(贪心):完成,1517 模拟的不好
第十三章(链表):完成
第十四章(基础算法与数据结构):除 1543 完成

You might also like