算法是程序的靈魂,一個優秀前端工程師對算法也是要有所了解的,本文總結了我們在開發、面試中經常會遇到的基礎算法,使用原生JS實現,未必是最優解,可以互相探討。
為了便于查看,簡單分下類,本文也會持續更新。
排序算法
1. 冒泡排序
function bubbleSort(arr){ var i = j = 0; for(i=1;i<arr.length;i++){ for(j=0;j<=arr.length-i;j++){ var temp = 0; if(arr[j]>arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } }}2. 快速排序
function quickSort(arr,l,r){ if(l < r){ var i = 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:將兩個按值有序序列合并成一個按值有序序列,則稱之為二路歸并排序。
function merge(left, right) { var result = [], 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++]); } return result;}字符串操作
1. 判斷回文字符串
function palindrome(str){ // /W匹配任何非單詞字符。等價于“[^A-Za-z0-9_]”。 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; //遞歸 return palindrome(lowRegStr.slice(1,lowRegStr.length-1));}2. 翻轉字符串
2.1 思路1:反向遍歷字符串
function reverseString(str){ var tmp = ''; for(var i=str.length-1;i>=0;i--) tmp += str[i]; return tmp}2.2 思路2:轉化成array操作。
function reverseString2(str){ var arr = str.split(""); var i = 0,j = arr.length-1; while(i<j){ tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } return arr.join("");}PS:什么?你要問為啥不直接操作str? 因為str[i]是只讀的,不能str[0]=str[1]這樣操作。
再PS:如果允許用reverse(),也可以用'str'.split('').reverse().join('')實現。
新聞熱點
疑難解答
圖片精選