# 数组相关

数组并不会有太复杂的题目来考,所以大多只是将想法转换成代码;
在数组这块会有一些常用的解题方式,如双指针法,滑动窗口 (双指针的一种应用),前缀和解决时间复杂度问题,即创建一个新的数组用于存储对应下标前面几个元素的和;二分查找等

# vector 与普通数组的使用区别

只有在一些低性能场景下,数组对比哈希表和 vector 会有一定的性能优势,会使用数组,其他大多数场景都会更加推荐使用 vector

1
2
3
4
5
6
7
8
//初始化
vector<int> nums(5,0); //5个元素,初始化为0
nums.push_back(19); //添加元素
nums.pop_back(); //删除元素
nums.insert(nums.begin()+2,99); //插入元素
nums.erase(nums.begin()+2);//删除指定位置
nums.clear(); //清空
sort(nums.begin(),nums.end());

# 链表

链表最重要的一点就是,我们要记住,大多数题目都有可能会删除头节点的可能性,所以我们需要创建一个虚拟的头节点以避免这个问题。

# 哈希表

常用的操作方式
以最常用的 unordered_map 和 unordered_set 为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//初始化
unordered_map<int,int> map;
unordered_set<int> set;
//插入元素
map[10] = 5;
set.insert(10);
//删除元素
map.erase(10);
set.
//获取元素||元素是否存在
int val = map.find(10);//如果不存在,则此值为map.end()
key = val->first;
value = val->second;
set同上
//遍历
for (auto& kv : mp) → kv.first, kv.second
for(int k:set)

# 字符串

在使用和学习字符串的时候,尽量不要去使用字符串的库函数,因为字符串的库函数我们并不一定记得住他的时间复杂度,而面试的时候如果被问到就会很显然的露怯
解题的时候,类似于反转类型的题目可以使用双指针法,而类似于字串的题目则可以考虑使用 KMP 来解决,而 KMP 掌握的不是很扎实,所以以后还需要回头来看。