虽然说咱们不少时候前端不多有机会接触到算法,但对算法的理解和掌握是一个优秀工程师的评价标准之一,并且当咱们面对较为复杂的问题,这些基础知识的积累能够帮助咱们更好的优化解决思路。在一段时间的学习以后,我总结罗列了前端中常见见的几个算法:前端
一:排序算法程序员
排序算法是比较开发的算法之一,方法种类较多,在此列举两种简单的排序算法:冒泡排序和快速排序。
冒泡排序其实就是经过比较相邻位置的元素大小,若是左边比右边大,就交换位置,继续比较,实际上就是每轮比较都得出一个最大值(或者最小值)。而后经过n-1轮比较,就能得出一个排好序的序列(经过设置一个flag,当数组基本有序的时候其实不必定须要比较到n-1轮)。算法
function bubbleSort(arr){ for(var i=1;i<arr.length;i++){ for(var j=0;j<arr.length-i;j++){ var temp; if(arr[j]>arr[j+1]){ temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return arr; }
快速排序简单来说就是咱们选定一个数,而后比它小的都放在它左边,大于等于它的都放在它右边,那么这个时候对这个数来说他的位置已经排到了正确的地方了,接下来要作的就是在它的左右两边分别再进行相似操做。数组
function quickSort(arr,l,r){ var i,j,x; if(l<r){ i=l; j=r; x=arr[i]; while(i<j){ while(i<j&&arr[j]>=x){ j--; } if(i<j){ arr[i]=arr[j]; } while(i<j&&arr[i]<x){ i++; } if(i<j){ arr[j]=arr[i]; } } arr[i]=x; //递归调用 quickSort(arr,i+1,r); quickSort(arr,l,i-1); } return arr; }
二:阶乘算法dom
function factorialize(num) { var result = num; if (num < 0) { return -1; } else if (num === 0 || num === 1) { return 1; } else { while (num > 1) { num--; result *= num; } } return result; }
三:回文字符串判断学习
若是一个字符串忽略标点符号、大小写和空格,正着读和反着读如出一辙,那么这个字符串就是palindrome(回文)。优化
function palindrome(str) { // 删除字符串中没必要要的字符 var re = /[W_]/g; // 将字符串变成小写字符 var lowRegStr = str.toLowerCase().replace(re, ''); // 若是字符串lowRegStr的length长度为0时,字符串便是palindrome if (lowRegStr.length === 0) { return true; } // 若是字符串的第一个和最后一个字符不相同,那么字符串就不是palindrome if (lowRegStr[0] !== lowRegStr[lowRegStr.length - 1]) { return false; } else { return palindrome(lowRegStr.slice(1, lowRegStr.length - 1)); } }
四:翻转字符串算法ui
function reverseString(str) { var tmp = ""; for (var i = str.length - 1; i >= 0; i--) { tmp += str.charAt(i); } return tmp; }
第二种翻转字符串算法:code
function reverseString(s) { var arr = s.split(''); var i = 0, j = arr.length - 1; while (i < j) { var t = arr[i]; arr[i] = arr[j]; arr[j] = t; i++; j--; } return arr.join(''); }
五:整型数组去重算法排序
主要考察程序员对Object的使用,利用key来进行筛选。
function unique(arr) var hashTable = {}; var data = []; for(var i = 0, l = arr.length; i < l; i++) { if(!hashTable[arr[i]]) { hashTable[arr[i]] = true; data.push(arr[i]); } } return data; }
六:数组中最大差值
function getMaxProfit(arr) { var minPrice = arr[0]; var maxPrice = arr[0]; var maxProfit = 0; for (var i = 0; i < arr.length; i++) { var currentPrice = arr[i]; minPrice = Math.min(minPrice, currentPrice); maxPrice = Math.max(maxPrice, currentPrice); } maxProfit = Math.max(maxPrice-minPrice,maxPrice); return maxProfit; }
七:随机指定长度字符串
function randomString(n) { var str = 'abcdefghijklmnopqrstuvwxyz9876543210'; var tmp = ''; var l = str.length; for(var i = 0; i < n; i++) { tmp += str.charAt(Math.floor(Math.random() * l)); } return tmp; }
八:统计字符串中次数最多字母
function findMaxDuplicateChar(str) { if(str.length == 1) { return str; } var charObj = {}; for(var i = 0; i < str.length; i++) { if(!charObj[str.charAt(i)]) { charObj[str.charAt(i)] = 1; } else { charObj[str.charAt(i)] += 1; } } var maxChar = '', maxValue = 1; for(var k in charObj) { if(charObj[k] >= maxValue) { maxChar = k; maxValue = charObj[k]; } } return maxChar; }
九:生成菲波那切数列数组
斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、一、一、二、三、五、八、1三、2一、3四、……在数学上,斐波纳契数列主要考察递归的调用。经过定义fibo[i] = fibo[i-1]+fibo[i-2];来生成斐波那契数组。
function getFibonacci(n) { var fibarr = []; var i = 0; while(i < n) { if(i <= 1) { fibarr.push(i); } else { fibarr.push(fibarr[i - 1] + fibarr[i - 2]) } i++; } return fibarr; }
以上几个前端中常常会出现的小算法是学习中的练习和总结,整理此文若是有错误但愿小伙伴们积极指正,有更好更简洁的算法知识也但愿不吝分享,以求共同进步。