C++和Python选手,记录一下自己的做题历程~
vector:
-
创建vector对象
vector<typename> name; // 也可以直接初始化,例如: vector<int> a = [...] vector<int> b(a.begin(), a.end()) -
尾部插入数字
vec.push_back(a); -
使用下标访问元素
cout<<vec[0]<<endl; -
使用迭代器访问元素
vector::iterator it; for(it = vec.begin(); it != vec.end(); it++) cout<<*it<<endl; -
插入元素
//在第i个元素后面插入a vec.insert(vec.begin()+i,a); -
删除元素
//删除第三个元素 vec.erase(vec.begin()+2); //删除区间[i,j-1]区间 vec.erase(vec.begin()+i-1,vec.begin()+j) -
向量大小
vec.size(); -
清空
//清空之后,vec.size()为0 vec.clear();
链表:
-
定义链表结构函数:
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; -
若要访问链表中的数值,则:
head->val;若访问链表的下一个值,则head = head->next;
哈希表:
- 建立基本数据类型的哈希表
unordered_map<int,int> m; //<string,string>,<char,char>
- 向哈希表中添加元素
- insert 函数
m.insert(pair<int,int>(1, 10));
m.insert(pair<int,int>(2, 20));
- 用数组方法直接添加
m[3]=30;
m[4]=40;
- 成员函数:
- begin()、end()
m.begin() //指向哈希表的第一个容器
m.end() //指向哈希表的最后一个容器,实则超出了哈希表的范围,为空
- find()查找函数
m.find(2) //查找key为2的键值对是否存在 ,若没找到则返回m.end()
if(m.find(2)!=m.end()) //判断找到了key为2的键值对
- count()函数
// 例如:查找哈希表中key为3的键值对,返回其数量,为1,则找到,若没找到则返回0
m.count(3) //返回 1
m.count(5) //返回0
- size()函数
m.size() //返回哈希表的大小
- empty()函数
m.empty() //判断哈希表是否为空,返回值为true/false
- clear()函数
m.clear() //清空哈希表
- swap()函数
// 交换两个哈希表中的元素,整个哈希表的键值对全部都交换过去
unordered_map<int,int> m1;
unordered_map<int,int> m2;
m1.swap(m2);
swap(m1,m2);
- 哈希表的遍历
- 第一种方法
unordered_map<int, int> count;
for (auto p : count) {
int front = p.first; //key
int end = p.second; //value
}
- 第二种方法
unordered_map<int, int> count;
for(auto it=m.begin();it!=m.end();it++)
{
int front = it->first; //key
int end = it->second; //value
}
树:
树是一种非线性的数据结构,相较于之前接触的队列、链表,树的一个节点可能会生成多个分支。
一般而言,一颗树有一个根节点,每个末端的节点被称为叶子结点。
- 完全二叉树:除了最后一层外其它层的结点个数全满,而且最后一层的结点从左到右排满直到最后一个节点。
- 满二叉树:所有层的结点全满:第n层有
2^(n-1)个点,共有2^n-1个点
-
完全二叉树的存储
- 一般以数组的[1]位置为根节点建立二叉树
- 数组的[t]位置的左儿子和右儿子对应的位置分别为[2t]和[2t+1],父亲节点的位置为[t/2]。
-
一般二叉树的存储
-
可以用数组下标模拟节点编号,用多个数组来记录节点信息。
-
也可以用struct存。
struct TreeNode { int val; int l,r,fa; }a[100001]; -
用指针存储二叉树
struct TreeNode { int val; TreeNode *l,*r,*fa; } TreeNode *root;
-
-
二叉树的基本操作
-
新建节点
struct TreeNode { int value; TreeNode *l, *r, *fa;//初始为NULL TreeNode(int x) {value = x;} } TreeNode *p = new TreeNode(x); -
根节点初始化
TreeNode *root; root = new TreeNode(v); -
删除节点
只需了解如何删除叶子结点,即将对应指针置为空即可。
-
插入子节点
void Insert(TreeNode *fa, TreeNode *p, int flag) { //flag = 0插入到左边,flag = 1插入到右边 if(!flag) fa->l = p; else fa->r = p; p->fa = fa; } TreeNode *p = new TreeNode(v); Insert(fa,p,flag);
-
-
二叉树的遍历
-
先序遍历(根->左->右)
void PreOrder(TreeNode *p) { cout<<p->value<<endl; if(p->l) PreOrder(p->l); if(p->r) PreOrder(p->r); } -
中序遍历(左->根->右)
void InOrder(TreeNode *p) { if(p->l) InOrder(p->l); cout<<p->value<<endl; if(p->r) InOrder(p->r); } InOrder(root); -
后序遍历
void PostOrder(TreeNode *p) { if(p->l) PostOrder(p->l); if(p->r) PostOrder(p->r) cout<<p->value<<endl; } PostOrder(root);
-
-
层级遍历(BFS,从上到下遍历)
TreeNode *q[N]; void Bfs(TreeNode *root) { int front = 1, rear = 1; q[1] = root; while(front <= rear) { TreeNode *p = q[front]; front++; cout<<p->value<<endl; if(p->l) q[++rear] = p->l; if(p->r) q[++rear] = p->r; } } Bfs(root);
集合:
1、set 的定义及初始化
set<Type> s //定义一个set容器
set<Type> s(s1) //定义一个set容器,并用容器s1来初始化
set<Type> s(b, e) //b和e分别为迭代器的开始和结束的标记
set<Type> s(s1.begin(), s1.begin()+3) //用容器s1的第0个到第2个值初始化s
set<Type> s(a, a + 5) //将a数组的元素初始化vec向量,不包括a[4]
set<Type> s(&a[1], &a[4]) //将a[1]~a[4]范围内的元素作为s的初始值
2、set 的基本操作
s.begin() //返回指向第一个元素的迭代器
s.end() //返回指向最后一个元素的迭代器
s.clear() //清除所有元素
s.count() //返回某个值元素的个数
s.empty() //如果集合为空,返回true,否则返回false
s.equal_range() //返回集合中与给定值相等的上下限的两个迭代器
s.erase() //删除集合中的元素
s.find(k) //返回一个指向被查找到元素的迭代器
s.insert() //在集合中插入元素
s.lower_bound(k) //返回一个迭代器,指向键值大于等于k的第一个元素
s.upper_bound(k) //返回一个迭代器,指向键值大于k的第一个元素
s.max_size() //返回集合能容纳的元素的最大限值
s.rbegin() //返回指向集合中最后一个元素的反向迭代器
s.rend() //返回指向集合中第一个元素的反向迭代器
s.size() //集合中元素的数目