雖然說咱們不少時候前端不多有機會接觸到算法,但對算法的理解和掌握是一個優秀工程師的評價標準之一,並且當咱們面對較爲複雜的問題,這些基礎知識的積累能夠幫助咱們更好的優化解決思路。在一段時間的學習以後,我總結羅列了前端中常見見的幾個算法:前端
一:排序算法程序員
排序算法是比較開發的算法之一,方法種類較多,在此列舉兩種簡單的排序算法:冒泡排序和快速排序。
冒泡排序其實就是經過比較相鄰位置的元素大小,若是左邊比右邊大,就交換位置,繼續比較,實際上就是每輪比較都得出一個最大值(或者最小值)。而後經過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; }
以上幾個前端中常常會出現的小算法是學習中的練習和總結,整理此文若是有錯誤但願小夥伴們積極指正,有更好更簡潔的算法知識也但願不吝分享,以求共同進步。