哈希表

常见的三种哈希结构:数组、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里面添加一个listres.add(Arrays.asList(nums[i],nums[left],nums[right]))

    字符串:使用StringBufferorStringBuilder可以提高修改的速度

  • Go

    哈希表:将map当作数组进行模拟

    需要注意增强循环里面:for i := range numsi是数组的下标,而不是值

    在切片中添加新数据: `res = append(res,[]int{nums[i],n2,n3})

    字符串:将string类型的字符串转化为[]byte进行操作


感谢卡尔劳斯的知识。