通过这次天梯赛选拔也是给最近有点膨胀的自己一点点惊醒,自己的水平还远远不够,一些最基础的知识都还运用的很不好,甚至没有印象,这一点很不好。还有一个月的蓝桥杯就要到了,再这样下去想拿到一个好的名次是非常困难的,要开始查漏补缺和复习一些基础知识了。总结了七个需要复习和检讨的地方。
1.在第四题最后对结果去重时,使用set不会遍历元素了,想到了用迭代器,但是写的时候磕磕碰碰,最后并没有全部AC。重新复习一下set的基本用法。(好像不对,因为set是有序的(大小),而题目最后输出时不能改变顺序)
1).set只能通过迭代器遍历,即遍历set集合前需要定义一个迭代器:set<type>:iterator it;然后使用*it去访问set中的元素
//循环输出set集合中的元素
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
cout<<*it<<endl;
}
2).插入元素,st.insert(x)
删除元素,st.erase(x)
查找(计数)元素,st.count(x)
2.输出小数点后2位
之前很少考虑这个问题,因为在力扣上刷题养成了直接输出的习惯,这样很不好,而且输出只会用printf,然后里面的参数有些弄混淆了,printf("%.2lf",x)输出浮点数x的小数点后2位,是在想了很久之后才用的,然后很惊险的过了一道题,在发红包的那道题,既要输出浮点数还要自定义排序(并且自定义排序也出问题了,后面详细讲)卡住了。并且使用printf时偷懒使用了万能头文件,因为不太记得要使用#include<cstdio>了。在书上看的时候也没用记得太牢。
1)使用setprecision()函数,且需要包含#include<iomainp>头文件
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
float a = 0.20001;
cout.setf(ios::fixed);
cout << "a=" <<fixed<< setprecision(2) << a <<endl; //输出结果为a=0.20
cout.unsetf(ios::fixed);
cout << "a=" << setprecision(2) << a <<endl; //输出结果为a=0.2
return 0;
}
2)使用printf()自带函数,且需要包含#include<cstdio>头文件
3.输入时数据有0
在做关于时间的题目的时候,遇到输入数据07:05,很自然的就定义了两个整型来输入,然后输出的时候发现输出的是07:00,就一直很纳闷难道是5没有读入吗,于是又定义了一个整形来接受,发现还是没有读入,最后才发现是这个特殊字符‘:’也是需要读入的,最后也只拿了7分,格式错误,再看一下(晕,中间少了一个‘ ’.不应该。
4.cmp排序
发红包这道题还是卡住了,但是现在的思路是用pair存入序号和对应的值然后sort,cmp排序没有问题了,但是对数组的操作和一些细节卡住了还要再操作一下。
(发现可以放入大根堆<pair<int,int>>中,自动就排序了然后遍历即可)
5.并查集
对第十题的思路,一开始是简单的染色,对朋友染成正数(递增),敌人标为负数(递减),这样只需判断是否相等就知道对应的关系了,但是忽视了朋友的朋友是朋友这一句话,所有这个逻辑是不成立的。后来的思路是使用并查集,将朋友和朋友的朋友都放入一个集合,再遍历时逐个输出。但是并查集的构造好像出问题了,现在复习一下。
int find(int x) //查询是否是同一个集合
{
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void join(int c1.int c2) //合并两个集合
{
int f1=find(c1),f2=find(c2);
if(f1!=f2) fa[f1]=f2;
}
6.二叉树
在力扣上刷题习惯直接用TreeNode了,没有定义结构体的习惯了;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
第十题是通过前序和中序遍历,重构二叉树,然后镜像翻转(非叶子节点左右孩子对换),再 层序遍历二叉树。在力扣上有类似的题目,掌握程度还不够。每次通过前序遍历找到根节点,再根据根节点将中序遍历分割为左、右部分,前序遍历也分割为左、右部分,再递归调用分割函数,构造二叉树。再运用队列,层序遍历二叉树即可。
7.堆
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
基础类型默认为大根堆
//对于pair来说,先比较第一个再比较第二个
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main()
{
priority_queue<pair<int, int> > a;
pair<int, int> b(1, 2);
pair<int, int> c(1, 3);
pair<int, int> d(2, 5);
a.push(d);
a.push(c);
a.push(b);
while (!a.empty())
{
cout << a.top().first << ' ' << a.top().second << '\n';
a.pop();
}
}