虽说我们很多时候前端很少有机会接触到算法。大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面。实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的。如果将来当我们面对较为复杂的问题,这些基础知识的积累可以帮助我们更好的优化解决思路。下面罗列在前端面试中经常撞见的几个问题吧。
1 判断一个单词是否是回文?
回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。比如 mamam redivider .
很多人拿到这样的题目非常容易想到用for 将字符串颠倒字母顺序然后匹配就行了。其实重要的考察的就是对于reverse的实现。其实我们可以利用现成的函数,将字符串转换成数组,这个思路很重要,我们可以拥有更多的自由度去进行字符串的一些操作。
function checkPalindrom(str){
return str==str.split('').reverse().join('');
}
2 去掉一组整型数组重复的值
let unique=function(arr){
let hashTable={};
let data=[];
for(let i=0,l=arr.length;i<l;i++){
if(!hashTable[arr[i]]){
hashTable[arr[i]]=true;
data.push(arr[i]);
}
}
return data
}
let hashTable={};
let data=[];
for(let i=0,l=arr.length;i<l;i++){
if(!hashTable[arr[i]]){
hashTable[arr[i]]=true;
data.push(arr[i]);
}
}
return data
}
3 统计一个字符串出现最多的字母
function findMaxDuplicateChar(str){if(str.length==1){return str;}let charObj={};for(let i=0;i<str.length;i++){if(!charObj[str.charAt(i)]){charObj[str.charAt(i)]=1;}else{charObj[str.charAt(i)]+=1;}}let maxChar='',maxValue=1;for(var k incharObj){if(charObj[k]>=maxValue){maxChar=k;maxValue=charObj[k];}}return maxChar;}
4 排序算法
如果抽到算法题目的话,应该大多都是比较开放的题目,不限定算法的实现,但是一定要求掌握其中的几种,所以冒泡排序,这种较为基础并且便于理解记忆的算法一定需要熟记于心。冒泡排序算法就是依次比较大小,小的的大的进行位置上的交换。function bubbleSort(arr){for(let i=0,l=arr.length;i<l-1;i++){for(let =i+1;j<l;j++){if(arr[i]>arr[j]){lettem=arr[i];arr[i]=arr[j];arr[j]=tem;}}}return arr;}
function quickSort(arr){if(arr.length<=1){return arr;}let leftArr=[];let rightArr=[];let q=arr[0];for(let i=1,l=arr.length;i<l;i++){if(arr[i]>q){rightArr.push(arr[i]);}else{leftArr.push(arr[i]);}}return [].concat(quickSort(leftArr),[q],quickSort(rightArr));}
5 不借助临时变量,进行两个整数的交换
这种问题非常巧妙,需要大家跳出惯有的思维,利用 a , b进行置换。
主要是利用 + – 去进行运算,类似 a = a + ( b – a) 实际上等同于最后 的 a = b;
function swap(a,b){
b=b-a;
a=a+b;
b=a-b;
return[a,b];
}
6 随机生成指定长度的字符串
function randomString(n){let str='abcdefghijklmnopqrstuvwxyz9876543210';let tmp='',i=0,l=str.length;for(i=0;i<n;i++){tmp+=str.charAt(Math.floor(Math.random()*l));}return tmp;}