虽然我们在前端接触算法的机会往往很少。其中大部分是交互式操作。但从各大公司的面试来看,算法仍然是考察的一方面。事实上,学习数据结构和算法有助于工程师理解和分析问题。如果我们以后面对更复杂的问题,这些基础知识的积累可以帮助我们更好地优化我们的解决方案。下面介绍几个前端面试经常遇到的问题。Q1判断一个词是否是回文?回文是指相同的词汇或句子,在后面的课文中互换或颠倒,造成从头到尾的循环。它被称为回文或循环。例如,mamamredivider。很多人拿到这样的题目,很容易想到用for把字符串的字母顺序倒过来再匹配。事实上,最重要的是检查反向的实现。其实我们可以使用现成的函数将字符串转换成数组。这个想法很重要,我们可以有更多的自由度来进行字符串操作。functioncheckPalindrom(str){returnstr==str.split('').reverse().join('');}Q2去除一组整数数组的重复值如input:[1,13,24,11,11,14,1,2]输出:[1,13,24,11,14,2]需要去掉重复的元素11和1。这个问题出现在很多前端面试题中。主要考察个人对Object的使用,使用key进行过滤。/***uniqueanarray**/letunique=function(arr){lethashTable={};letdata=[];for(leti=0,l=arr.length;i=maxValue){maxChar=k;maxValue=charObj[k];}}returnmaxChar;}module.exports=findMaxDuplicateChar;Q4如果排序算法得到算法题目,大部分应该是比较开放的题目,不限算法的实现,但是要掌握其中的几个,所以冒泡排序这种比较基础的算法,好理解好记,一定要背。冒泡排序算法就是依次比较大小,交换小的和大的位置。functionbubbleSort(arr){for(leti=0,l=arr.length;iarr[j]){lettem=arr[i];arr[i]=arr[j];arr[j]=tem;}}}returnarr;}module.exports=bubbleSort;除了冒泡排序,其实还有很多如插入排序、快速排序、希尔排序等。每种排序算法都有自己的特点。不一定要全部掌握,但是一定要对几种算法心里有数。例如,快速排序是非常高效的,其基本原理如图(来自wiki):算法引用某个元素值,将小于它的值放入左数组,将大于它的元素放入右数组中的值,然后对左右数组递归执行最后一次操作,返回的合并数组就是排序后的数组。functionquickSort(arr){if(arr.length<=1){returnarr;}letleftArr=[];letrightArr=[];letq=arr[0];for(leti=1,l=arr.length;iq){rightArr.push(arr[i]);}else{leftArr.push(arr[i]);}}return[].concat(quickSort(leftArr),[q],quickSort(rightArr));}module.exports=quickSort;安利一个给大家学习的地址,通过动画演示了算法的实现。HTML5CanvasDemo:SortingAlgorithms(http://math.hws.edu/eck/jsdemo/sortlab.html)Q5不使用临时变量交换两个整数输入a=2,b=4输出a=4,b的问题=2很巧妙,需要大家跳出平时的思维,用a和b来代替。主要是用+-来进行运算,类似于a=a+(b–a)其实等价于***a=b;functionswap(a,b){b=b-a;a=a+b;b=a-b;return[a,b];}module.exports=swap;Q6用canvas画有限斐波那契数列曲线?数列的长度限制为9。斐波那契数列,又称黄金分割数列,指的是这样一个数列:0,1,1,2,3,5,8,13,21,34,...在数学中,斐波那契数列主要考察递归调用。我们一般都知道fibo[i]=fibo[i-1]+fibo[i-2]的定义;生成斐波那契数组函数的方法getFibonacci(n){varfibarr=[];vari=0;while(i