第二周总结 | 哈希表&&栈与队列 && 双指针
哈希表
常见的三种哈希结构:数组、set、map
当我们需要快速判断一个元素是否出现在集合里的时候,就考虑哈希法。
set
可以去重
如果需要统计元素出现过多少次 && 去重 -> 使用map
【总结】
map虽然是万能的,但是我们也需要判断好什么时候用数组、什么时候用set。
双指针
需要注意边界值,很容易造成越界。
三数之和 && 四数之和是很明显的使用双指针的题目,通过选取当前值的下一位向后遍历、选取最后的值向前遍历,完成对当前值的和进行扫描统计。同时,我们需要完成去重的逻辑 : 一定要放在一个符合条件的结果下面,不然会导致当前结果无法写入结果集。
在四数之和中,我们还可以完成去重和剪枝的操作,但是需要判断好剪枝的条件是否完全正确。
字符串
双指针法
使用双指针完成对字符串位置交换(逆序排序)的操作。
KMP算法
解决:字符串匹配问题
找不匹配字符的前一位的最长相等前后缀的下一位(相当于节省了重头开始遍历、从前面前后缀相同的下一位开始重新寻找)
1.1通过模式串来初始化前缀表(next表)
1.2.处理前后缀不相同
1.3.处理前后缀相同
2.使用next表对字符串进行匹配
【存在的问题】
仍然对循环遍历的边界条件不清楚!
链表
- 反转链表:创建一个虚拟头结点实现对12节点next指针指向的改变、然后将虚拟头结点指向3节点
- 求链表的环:使用快慢指针,当快指针等于慢指针时,新创建两个节点index1从头结点出发,index2从fast(slow)指针出发进行遍历,当index1 == index2则说明找到了环的入口。
【语言总结】
Java
set转数组函数:
set.steam().mapToInt(x ->x),toArray()
直接在list里面添加一个list
res.add(Arrays.asList(nums[i],nums[left],nums[right]))
字符串:使用
StringBuffer
orStringBuilder
可以提高修改的速度Go
哈希表:将map当作数组进行模拟
需要注意增强循环里面:
for i := range nums
中i
是数组的下标,而不是值在切片中添加新数据: `res = append(res,[]int{nums[i],n2,n3})
字符串:将
string
类型的字符串转化为[]byte
进行操作
感谢卡尔劳斯的知识。