前言
日期:2020-04-24
- 初始内容:常见算法题
一、字符串
1. KMP算法
- 概念:对字符串进行切割分组(前缀、后缀),按顺序匹配时,利用分组子串提高匹配效率
- 作用:解决字符串查找的问题
- 时间复杂度O(m+n) 空间复杂度O(m)
- 延伸
- 暴力匹配算法:每次匹配失败,都重新回溯(匹配不到,索引回到上一次匹配到的位置,再+1继续从第一个开始匹配)
2. 替换空格
题目:将给定的字符串中的空格全部替换为233
- 常规方法:遍历,查找到空格的字符串索引位置,再进行添加
- API: string.replaceAll(“\s”,”233”);
3. 最长公共前缀
题目:查找给定字符串数组中的最长公共前缀
- 特别的技巧思路:先排序
1 | // 不使用排序则需要嵌套循环 |
4. 回文串
题目:给定字符串(区分大小写),构造出最长的回文串(正读、反读一致),返回长度
1 | private static int getLengthOfHw(String s) { |
题目:验证回文串,忽略空格,大小写
- 技巧:判断字符是否为子母或数字 Character.isLetterOrDigit()
1 | private static boolean vertifyHw(String s, int frontIndex, int endIndex){ |
题目:给定字符串,找出其中最长的回文子串
- 技巧:中心扩展法
1 | // 获取给定字符串中,最长的回文子串 |
题目:获取字符串中最长的回文子序列
5. 括号匹配深度
题目:给定一个合法的括号序列,获取其深度
- 思路:从第一个字符往后遍历,遇到 ( 则count++,否则 count–;每次循环保存max值,max 保存每次循环中max和count的最大值
1 | // 获取括号的深度 |
6. 字符串转化为整数
题目:将字符串转化为整数,不合法的则返回0
- 思路:类型转化,将每个字符通过加法计算出来。
- 注意点:char转化int,是通过ascii码。
1 | private static int stringToInt(String s) { |
二、简单排序算法
1.冒泡排序
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。【维基百科】
- 思路:第一个字符开始,从头到尾依次相邻比较,大的放后面;循环此步骤
- 空间复杂度:O(1)
- 时间复杂度
- 最好:O(1)
- 最坏:O(n^2)
- 平均:O(n^2)
1 | // 1.冒泡排序,从小到大 |
2.选择排序
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。【维基百科】
- 思路:从第一个字符开始往后比较,知道找到最值,交换位置;循环此步骤
- 空间复杂度:O(1)
- 时间复杂度
- 最好:O(1)
- 最坏:O(n^2)
- 平均:O(n^2)
1 | // 选择排序,从小到大 |
3.插入排序
工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。【维基百科】
- 思路:从第一个字符开始,每次往后一个字符与前面(已经排好序)进行比较
- 空间复杂度:O(1)
- 时间复杂度
- 最好:O(1)
- 最坏:O(n^2)
- 平均:O(n^2)
1 | // 插入排序 |
4.希尔排序
也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。通过将比较的全部元素分为几个区域来提升插入排序的性能。【维基百科】
思路:先进行分组排序,再对每一组进行插入排序,每完成一次排序,都对分组数进行缩小
空间复杂度:O(1)
时间复杂度
- 最好:O(1)
- 最坏:O(n^2)
1 | // 希尔排序 |
5.快速排序
又称分区交换排序),简称快排,是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。【百度百科】
- 思路:找到基准数字,每次分组(子序列)比较,递归排序
- 复杂度
- 空间复杂度:O(log2n))
- 时间复杂度:O(nlog2n)
1 | // 快速排序 |