序
学习数据结构和算法有助于工程师理解和分析问题。如果我们将来面临更复杂的问题,积累这些基础知识可以帮助我们更好地优化解决方案。以下是你在前端面试中经常遇到的问题清单。
Q1判断一个字是否是回文。
回文是指在接下来的文字中,改变同一个单词或句子的位置,或者把它们颠倒过来,从而创造出首尾相连的循环的趣味,这叫回文,也叫循环。就像玛姆雷迪维德。
很多人得到这样一个话题,很容易想到用for来颠倒字符串的字母顺序,然后进行匹配。事实上,重要的调查是实施反向调查。事实上,我们可以使用现成的函数将字符串转换为数组。这个想法非常重要,我们可以有更多的自由在字符串上执行一些操作。
函数CheckParidRom(str){ return str==str . split(')。反转()。join(' ');}Q2删除了一组整数数组重复值
例如,输入: [1,13,24,11,11,14,1,2]
输出: [1,13,24,11,14,2]
需要删除重复的元素11和1。
这个问题出现在很多前端面试问题中,主要是调查个人对Object的使用情况和使用key进行筛选。
/*** unique一个数组* */let unique=function(arr){ let hashTable={ };让数据=[];for(设i=0,l=arr.lengthil;i ) { if(!哈希表[arr[i]]) {哈希表[arr[I]]=true;data . push(arr[I]);} }返回数据} module.exports=uniqueQ3统计字符串中出现次数最多的字母
给出一段连续的英文字符,找出出现频率最高的字母
输入:afjghdfraaaasdenas
产出:a
过去重复的算法出现在前面,这里需要统计重复的次数。
函数FindMaxDuplicatechar(str){ if(str . length==1){ return str;}让charObj={ };for(设I=0;istr.lengthi ) { if(!charObj[str . charat(I)]{ charObj[str . charat(I)]=1;} else { charObj[str . charat(I)]=1;} }让maxChar=' ',MaxValue=1;for(charObj中的var k){ if(charObj[k]=MaxValue){ MaxChar=k;maxVaLue=CharObj[k];} }返回maxChar} module . exports=FindMaxReportechar;Q4排序算法
如果选择算法题目,大部分应该是相对开放的题目,不限制算法的实现,但一定要掌握其中的几个,所以相对基础且容易理解记忆的冒泡排序一定要背熟。气泡排序算法是依次比较大小,交换大小的位置。
函数bubbleSort(arr) { for(让i=0,l=arr.lengthil-1;i ) { for(让j=I ^ 1;JL;j){ if(arr[I]arr[j]){ let tem=arr[I];arr[I]=arr[j];arr[j]=tem;} } }返回arr} module.exports=bubbleSort除了冒泡排序,还有很多其他排序,比如插入排序、快速排序、希尔排序等等。每种排序算法都有自己的特点。不需要全部掌握,但一定要熟悉心中的几个算法。例如,快速排序非常高效,其基本原理如图(来自wiki):
该算法引用一个元素的值,将小于它的值放入左数组,将大于它的元素放入右数组,然后递归执行最后一个左右数组操作,并将合并后的数组作为已按顺序排列的数组返回。
函数quick sort(arr){ if(arr . length=1){ return arr;}让LeftArr=[];让right arr=[];设q=arr[0];for(设i=1,l=arr.lengthil;I){ if(arr[I]q){ right arr . push(arr[I]);} else { left arr . push(arr[I]);} }返回[]。concat(quickSort(leftArr),[q],quick sort(right arr));} module.exports=quickSort安利每个人都有一个学习地址,算法的实现用动画演示。
HTML5画布演示:排序算法
Q5在不使用临时变量的情况下交换两个整数
输入a=2,b=4,输出a=4,b=2
这种问题很巧妙,需要我们跳出平时的思维,用A和B进行替换。
它主要用-来执行操作,类似于a=a (b-a),实际上相当于最后一个a=b;
函数交换(a,b){ b=B- a;a=a b;b=a-b;返回[a,b];} module.exports=swapQ6用画布画出有限的斐波那契数列曲线?
该系列的长度限制为9。
斐波那契数列,也叫黄金分割数列,指的是这样一个数列:0,1,1,2,3,5,8,13,21,34,数学上,斐波那契数列主要研究递归调用。我们通常知道这个定义
fibo[I]=fibo[I-1]fibo[I-2];一种生成斐波那契数组的方法
函数GetFibonacci(n){ var fibar=[];var I=0;while(in){ if(I=1){ fibar . push(I);} else { fibar . push(fibar[I-1]fibar[I-2])} I;}返回fibarr}剩下的工作就是用画布圆弧法画曲线
演示
Q7找出以下正数组之间的最大差异,如:
输入[10,5,11,7,8,9]
产出6
这是通过一个主题来测试对基本数组最大值的搜索。显然,我们知道最大差值一定是数组中最大值和最小值之间的差值。
函数GetMaxPeriod(arr){ var minPrice=arr[0];var MaxPeriod=0;for(var I=0;一、长度;I){ var CurrentRice=arr[I];minPrice=Math.min(minPrice,current price);var潜在收益=current price-min price;最大利润=数学最大值(最大利润,潜在利润);}返回MaxPeriod;}Q8随机生成指定长度的字符串
实现一种算法,随机生成是指指定长度的字符通道。
例如,给定长度的8个输出4ldkfg9j
函数randomString(n){ let str=' abcdefghijklmnopqrstuvwxyz 9876543210 ';设tmp=' ',i=0,l=str.lengthfor(I=0;I n;I){ tmp=str . charat(math . floor(math . random()* l));}返回tmp} module.exports=randomStringQ9实现了类似于getElementsByClassName的功能
自己实现一个函数,在一个DOM节点下找到包含一个类的所有DOM节点?不允许使用本机提供的DOM查找函数,如getelementsbyclassname query selectorall。
函数queryClassName(节点,名称){ var starts='(^|[ nrtf]',ends='([ n r t f]| $)';var array=[],regex=new RegExp(starts name ends),elements=node . getelementsbytagname(' * '),length=elements.length,i=0,element;while(I length){ element=elements[I];if(regex . test(element . class name)){ array . push(element);} I=1;}返回数组;}Q10使用JS实现二叉查找树
一般来说,完成写作的概率比较小,但重点是你对它的理解和一些基本特征的实现。二叉查找树,也称为二叉查找树和有序二叉树,是指具有以下属性的空树或二叉树:
如果任一节点的左子树不为空,则左子树中所有节点的值都小于其根节点的值;如果任意节点的右子树不为空,则右子树中所有节点的值都大于其根节点的值;任意节点的左右子树也分别是二分搜索法树。没有键值相等的节点。与其他数据结构相比,二叉查找树的优势在于搜索和插入的时间复杂度较低。是0(对数n)。二叉查找树是一种基本的数据结构,用于构建更抽象的数据结构,如集合、多集合、关联数组等。
写的时候需要了解二叉查找树的特点,需要先设置好每个节点的数据结构
类Node {构造函数(数据,左,右){ this.data=datathis.left=leftthis.right=右;}}树由节点组成,节点从根节点逐渐延伸到每个子节点。因此,它的基本结构是有一个根节点以及添加、搜索和删除节点的方法。
类BinarySearchTree { constructor(){ this。root=null}插入(数据){让n=新节点(数据,null,null);if(!this . root){ 0返回这个。root=n;}让currentNode=this.root让parent=null while(1){ parent=CurrentNode;if(数据当前节点。数据){当前节点=当前节点。向左;if(CurrentNode===null){ parent。左=n;打破;} } else {当前节点=当前节点。右;if(CurrentNode===null){ parent。右=n;打破;} } } }移除(数据){这个。根=这个。移除节点(这。根,数据)} removeNode(节点,数据){ if(节点==null){返回null;} if(数据==node.data) { //无子节点if(节点。left==null节点。right==null){ return null;} if(节点。left==null){返回节点。右;} if(节点。right==null){返回节点。向左;}让getminist=function(node){ if(node。left===空节点。right==null){返回节点;} if(node.left!=null){返回节点。向左;} if(node.right!==null){ 0返回getminist(节点。右);} }让temNode=getminist(node。右);节点。data=temnode。数据;节点。右=这个。移除节点(temnode。好的,temnode。数据);返回节点;} else if(数据节点。数据){ node。左=这个。移除节点(节点。左,数据);返回节点;} else { node。右=这个。移除节点(节点。右,数据);返回节点;} } find(data){ var current=this。根;而(当前!=null){ if(数据==当前。数据){ break} if(当前数据。数据){ current=current。向左;} else { current=current.right } }返回current.data} }模块。exports=BinarySearchTree总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。