## 算法快速入门
### 数据结果与算法
数据结构是一种数据的表现形式,如链表,二叉树,栈,队列等都是内存中一段数据表现的形式。算法是一种通用的解决问题的模板或者思路,大部分数据结构都有一套通用的算法模板,所以掌握这些通用的算法模板即可解决各种算法问题。
后面会分专题讲解各种数据结构,基本的算法模板和一些高级算法模板,每一个专题都有一些经典练习题,完成所有练习题后,你对数据结构和算法会有新的收获和体会。
先介绍两个算法题,试试感觉~
#### 示例1
[strStr](https://leetcode-cn.com/problems/subsets/)
`给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从 0 开始)。如果不存在,则返回 -1。`
思路:核心点是遍历给定字符串字符,判断以当前字符开头字符串是否等于目标字符串
* 循环时,i不需要到len-1
* 如果找到目标字符串,len(needle) == j
*
代码实现
```
func strStr(haystack string, needle string) int {
if len(needle) == 0 {
return 0
}
var i, j int
for i = 0; i < len(haystack) - len(needle) + 1; i++ {
for j = 0; j < len(needle); j++ {
if haystack[i + j] != needle[j] {
break
}
}
if (j == len(needle)) {
return i
}
}
return -1
}
```
#### 示例2
[subsets](https://leetcode-cn.com/problems/subsets/submissions/)
`给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。`
思路:这是一个典型的应用回溯法的题目,简单来说就是穷尽所有可能性,算法模板如下
```
result = []
func backtrack(选择列表,路径):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(选择列表,路径)
撤销选择
```
通过不停的选择,撤销选择,来穷尽所有可能性,最后将满足条件的结果返回
代码实现
```
func subsets(nums []int) [][]int {
result := make([][]int, 0)
sub := make([]int, 0)
backtrack(nums, 0, sub, &result)
return result
}
// nums 给定的集合
// pos 下次添加到集合中的元素位置索引
// sub 临时结果集合(每次需要复制保存)
// result 最终结果
func backtrack(nums []int, pos int, sub []int, result *[][]int) {
ans := make([]int, len(sub))
copy(ans, sub)
*result = append(*result, ans)
for i := pos; i < len(nums); i++ {
sub = append(sub, nums[i])
backtrack(nums, i + 1, sub, result)
sub = sub[0 : len(sub) - 1]
}
}
```
### 面试注意点
我们大多数时候,刷算法题可能都是为了准备面试,所以面试的时候需要注意一点
* 快速定位题目的知识点,找到知识点的通用模板,可能需要根据题目特殊情况做特殊处理
* 先去朝一个解决问题的方向,先抛出可能解,而不是最优解,先解决再优化
* 代码风格要统一,熟悉各类语言的代码规范
命名尽可能简洁明了,尽量不要用数字命名如:i1,node1,a1,b2
* 常见错误总结
访问下标不能越界
空值nil问题run time error
- 空白目录
- 算法
- 排序
- 冒泡排序
- 选择排序
- 插入排序
- 归并排序
- 快速排序
- 计数排序
- 桶排序
- 基数排序
- 希尔排序
- 堆排序
- 二分查找
- 最小堆
- 最小索引堆
- 平衡二叉树(AVL tree)
- bitmap位图
- 布隆过滤器
- hashmap
- topK
- 跳表
- LRU Cache
- kmp
- 最小堆和堆排序
- 最短路径
- C++
- 运行时类型判断RTTI
- C++反射
- 手动实现智能指针
- 序列化实现
- rpc实现
- std::forward
- 函数指针的妙用
- C/C++
- std::function
- 同步队列
- 线程池实现
- std::promise
- 深入理解虚函数
- extern "C" 关键字讲解
- 大端小端的区别
- 简历
- 简历1
- redis
- 数据结构和对象
- sds
- list
- zskiplist
- 腾讯云redis面试题总结
- redis集群部署
- LeetCode
- 目标
- go基础
- 算法快速入门
- 数据结构篇
- 二叉树
- 链表
- 栈和队列
- 二进制
- 基础算法篇
- 二分搜索
- 排序算法
- 动态规划
- 算法思维
- 递归思维
- 滑动窗口思想
- 二叉搜索树
- 回溯法
- 其他
- 剑指offer
- 笔记
- git代理加速
- Linux
- vim大法
- vscode远程不能跳转
- cmake
- 设计模式
- 单例模式
- 简单工厂模式
- 外观模式
- 适配器模式
- 工厂方法模式
- 抽象工厂模式
- 生成器模式
- 原型模式
- 中介者模式
- 观察者模式
- 访问者模式
- 命令模式
- 网络编程
- epoll reactor模式
- linux timerfd系列函数总结
- IO
- mapreduce
- 反射器
- leo通信库
- Mutex
- Condition
- thread
- raft
- 协程
- hook
- 定时器
- 别人的面试经验
- 面试题
- vector崩溃问题
- JAVA
- Linux java环境配置
- ucore
- lab1
- FreeNOS
- leveldb
- 刷题笔记
- 回文串
- 前缀树
- 字符串查找
- 查找两个字符串a,b中的最长公共子串
- 动态规划
- golang
- 顺序循环打印实现
- 数据结构
- rpc运用
- python
- 单例
- 深拷贝浅拷贝
- 链表
- python基础题
- mysql
- 事务
- Linux
- 共享内存
- 刷题记录
- 贪心算法
- 动态规划
- 面试
- 腾讯C++面试
- 微众面试JD
- 迅雷网络面试
- 学习网址
- rabbitMq
