天梯赛L1,L2的常考考点:
L1:
- 输入输出、字符串处理
- 简单数学:整除、取余、最大公约数、最小公倍数、素数判断
- 简单循环、条件判断
- 结构体/简单排序
- 水题占比极高,不卡算法,只卡细心
L2:
-
基础数据结构:栈、队列、链表、二叉树遍历
-
排序、二分查找
-
简单图:连通性、最短路(Dijkstra 简化版)
-
简单递归 / 暴力枚举
-
模拟题(逻辑长,但不难)
需要注意的细节处理:
天梯赛的基础题不难,但是有的时候可能卡在细节处理上,比如赋值,数值溢出,越界访问等细节,导致一些案例WA,下面是我总结的比较容易犯错的几个点还有需要记住的细节。
vector数组的插入:
在写vector数组进行读取数值的操作的时候,需要注意有没有一开始就给数组开辟了空间,如果已经开辟了空间,直接用下标,如果没有,用push_back()。因为有可能出现你已经开辟了空间,但是写入数据使用的是push_back(),这样你取出来的数据就有可能不对。
你可能觉得没什么,但是有时候脑子一热就有可能写错,检查的时候却反应不过来,所以最好养成这样一个习惯。
栈的读取:
注意在读取栈中的元素时一定要确保栈是非空的,否则程序会出错,每次写一句**!st.empty()**总是没有问题的,多一重保险嘛。
string字符串的常用操作(常考):
string是天梯赛的常考知识点,所以下面的常见操作一定要掌握:
以string s="hello"为例
1.清空字符串:s.clear()
2.插入/删除:
插入:s.insert(2,"xx"),表示在索引2前面插入字符串"xx"
删除:s.erase(2,2),表示从索引2开始删除两个字符
3.访问字符:
s.front()/s.back(),分别为访问第一个和最后一个字符
4.查找:
int pos=s.find("h"),find函数返回字符的索引 ,如果字符串中找不到这个字符,则返回string::npos
5.分割空格:
分割空格操作:
下面是分割字符操作的代码模板,考试时可以直接写;
cpp
vector<string> parts;//parts里存的是分割的字符串
string temp;
stringstream ss(s);
while(ss>>temp){
parts.push_back(temp);
}
6.分割指定字符,如!,&等,
我们将这些字符记为delim,函数模板如下;
cpp
vector<string>split(string& s,char delim){
vector<string> parts;//parts里存的是分割的字符串
string temp;
stringstream ss(s);
while(getline(ss,temp,delim)){
parts.push_back(temp);
return parts;
}
还有要注意的一点是,如果你用cin>>s;那么程序在读取到空格后会终止的,如果你想要读取含有空格的字符串,例如"hello world",需要用getline(cin,s);
还有在使用getline时,最后看一下前面是否有空行,若有需要用cin.ignore(),否则就算你用了getline,也读取不了字符串
优先级队列:
天梯赛考优先级队列考的也相对较多,下面是优先级队列的几个模板。
优先级队列默认是大顶堆,小顶堆的写法如下:
cpp
priority_queue<vector<int>,vector<vector<int>>,greater<vector<int>>heap;
那如果我想要自定义比较函数呢?也很简单,priority_queue的模板如下:
priority_queue<元素类型,底层容器,比较函数>
例如;其中cmp是自定义比较函数,
cpp
priority_queue<vector<int>,vector<vector<int>>,decltype(cmp)>heap(cmp);
总结:
好了,要说的就这么多了,其实天梯赛想要拿100+还是很容易的,注意一下细节不要犯错就可以了,但是想要拿到高分还是要多练算法。