首先本篇主要介绍算法对于我们前端开发者有什么好处和作用。
他有什么特征呢?一个算法应该具有以下五个重要的特征:
数据结构和算法是分不开,也是我们程序员必须要掌握的,不管前端技术更新的多快,框架怎么更新,版本如何迭代,它终究不会变的。
下面介绍几种数据结构和相应常见算法思想,首先介绍一下数据结构:
还有一些常见的算法:
对于前端来说我们所熟知数据结构就是字符串、数组、也可以利用对象实现哈希表。对于算法来说在写业务时经常用到递推、递归、穷举等
这期我们先介绍一下字符串以及长碰见的问题
字符串的概念我这边就不多说了,大家都是常用的。
先来个简单的题吧
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。你可以假设数组中的所有字符都是ASCII码表中的可打印字符。
示例1:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]
示例2:输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"]
一般大家见到这个题的时候直接reverse,但这么做就没有这个题的理解了,
我们可以使用双指针的方法。对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
示例1:输入:s="Wearehappy."输出:"We%20are%20happy."
一眼看见这个题把空格去除,再进行替换重组就可以了,但这明显是简单了。我们可以换个思路,首先扩充数组到每个空格替换成"%20"之后的大小。然后从后向前替换空格,也就是双指针法,这样我们就把O(n^2)变成了O(n)
constreplaceSpace=(s)=>{consts=Array.from(s)constcount=s.reduce((prev,cur)=>{returnprev+=cur===''1:0},0)letl=s.length-1letr=s.length+count*2-1while(l>=0){if(s[l]===''){s[r--]='0's[r--]='2's[r--]='%'l--}else{s[r--]=s[l--]}}returns.join('')]重复的字符串给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例1:输入:"abab"输出:True解释:可由子字符串"ab"重复两次构成。
示例2:输入:"aba"输出:False
示例3:输入:"abcabcabcabc"输出:True解释:可由子字符串"abc"重复四次构成。(或者子字符串"abcabc"重复两次构成。)
我们可以使用KMP(KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数)本身包含了模式串的局部匹配信息)。