JS常见算法详解
算法是程序的灵魂,一个优秀前端工程师对算法也是要有所了解的,本文总结了我们在开发、面试中经常会遇到的基础算法,使用原生JS实现,未必是最优解,可以互相探讨。
为了便于查看,简单分下类,本文也会持续更新。
排序算法
1.冒泡排序
functionbubbleSort(arr){ vari=j=0; for(i=1;i<arr.length;i++){ for(j=0;j<=arr.length-i;j++){ vartemp=0; if(arr[j]>arr[j+1]){ temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } }
2.快速排序
functionquickSort(arr,l,r){ if(l<r){ vari=l,j=r,x=arr[i]; while(i<j){ while(i<j&&arr[j]>x) j--; if(i<j) //这里用i++,被换过来的必然比x小,赋值后直接让i自加,不用再比较,可以提高效率 arr[i++]=arr[j]; while(i<j&&arr[i]<x) i++; if(i<j) //这里用j--,被换过来的必然比x大,赋值后直接让j自减,不用再比较,可以提高效率 arr[j--]=arr[i]; } arr[i]=x; quickSort(arr,l,i-1); quickSort(arr,i+1,r); } }
3.二路归并
PS:将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序。
functionmerge(left,right){ varresult=[], il=0, ir=0; while(il<left.length&&ir<right.length){ if(left[il]<right[ir]){ result.push(left[il++]); }else{ result.push(right[ir++]); } } while(left[il]){ result.push(left[il++]); } while(right[ir]){ result.push(right[ir++]); } returnresult; }
字符串操作
1.判断回文字符串
functionpalindrome(str){ //\W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。 varre=/[\W_]/g; //将字符串变成小写字符,并干掉除字母数字外的字符 varlowRegStr=str.toLowerCase().replace(re,''); //如果字符串lowRegStr的length长度为0时,字符串即是palindrome if(lowRegStr.length===0) returntrue; //如果字符串的第一个和最后一个字符不相同,那么字符串就不是palindrome if(lowRegStr[0]!=lowRegStr[lowRegStr.length-1]) returnfalse; //递归 returnpalindrome(lowRegStr.slice(1,lowRegStr.length-1)); }
2.翻转字符串
2.1思路1:反向遍历字符串
functionreverseString(str){ vartmp=''; for(vari=str.length-1;i>=0;i--) tmp+=str[i]; returntmp }
2.2思路2:转化成array操作。
functionreverseString2(str){ vararr=str.split(""); vari=0,j=arr.length-1; while(i<j){ tmp=arr[i]; arr[i]=arr[j]; arr[j]=tmp; i++; j--; } returnarr.join(""); }
PS:什么?你要问为啥不直接操作str?因为str[i]是只读的,不能str[0]=str[1]这样操作。
再PS:如果允许用reverse(),也可以用'str'.split('').reverse().join('')实现。
3.生成指定长度随机字符串
PS:配合模糊等效果可以生成个验证码--
functionrandomString(n){ varstr='abcdefghijklmnopqrstuvwxyz0123456789'; vartmp=''; for(vari=0;i<n;i++) tmp+=str.charAt(Math.round(Math.random()*str.length)); returntmp; }
4.统计字符串中次数最多字母
PS:利用Object中key的唯一性,利用key来进行筛选,然后计数。
functionfindMaxDuplicateChar(str){ if(str.length==1){ returnstr; } varcharObj={}; for(vari=0;i<str.length;i++){ if(!charObj[str.charAt(i)]){ charObj[str.charAt(i)]=1; }else{ charObj[str.charAt(i)]+=1; } } varmaxChar='', maxValue=1; for(varkincharObj){ if(charObj[k]>=maxValue){ maxChar=k; maxValue=charObj[k]; } } returnmaxChar+':'+maxValue; }
数组操作
1.数组去重
PS:还是利用Object中key的唯一性,利用key来进行筛选。
functionunique(arr){ varobj={} vardata=[] for(variinarr){ if(!obj[arr[i]]){ obj[arr[i]]=true; data.push(arr[i]); } } returndata; }
2.Number数组中最大差值
functiongetMaxProfit(arr){ varmin=arr[0],max=arr[0]; for(vari=0;i<arr.length;i++){ if(arr[i]<min) min=arr[i]; if(arr[i]>max) max=arr[i]; } returnmax-min; }
其他常见算法
1.阶乘
1.1非递归实现
functionfactorialize(num){ varresult=1; if(num<0)return-1; if(num==0||num==1)return1; while(num>1) result*=num--; returnresult; }
1.2递归实现
functionfactorialize(num){ varresult=1; if(num<0)return-1; if(num==0||num==1)return1; if(num>1){ returnnum*factorialize(num-1); } }
2.生成菲波那切数列
PS:斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列主要考察递归的调用。通过定义fibo[i]=fibo[i-1]+fibo[i-2];来生成斐波那契数组。
2.1强行递归实现
functiongetfib(n){ if(n==0) return0; if(n==1) return1; if(n>1){ returngetfib(n-1)+getfib(n-2); } } functionfibo(len){ varfibo=[]; for(vari=0;i<len;i++) fibo.push(getfib(i)); returnfibo; }
2.2简约非递归版
functiongetFibonacci(n){ varfibarr=[]; vari=0; while(i<n){ if(i<=1){ fibarr.push(i); }else{ fibarr.push(fibarr[i-1]+fibarr[i-2]) } i++; } returnfibarr; }
3.二分查找
PS:二分查找又称折半查找,是在有序数组查找中用到的较为频繁的一种算法,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。
3.1非递归实现
functionbinary_search(arr,key){ varlow=0, high=arr.length-1; while(low<=high){ varmid=parseInt((high+low)/2); if(key==arr[mid]){ returnmid; }elseif(key>arr[mid]){ low=mid+1; }elseif(key<arr[mid]){ high=mid-1; } } return-1; };
3.2递归实现
functionbinary_search2(arr,low,high,key){ if(low>high) return-1; varmid=parseInt((low+high)/2); if(key==arr[mid]) returnmid; elseif(key>arr[mid]) returnbinary_search2(arr,mid+1,high,key); elseif(key<arr[mid]) returnbinary_search2(arr,low,mid-1,key); }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!