您好,登錄后才能下訂單哦!
算法是程序的靈魂,一個優秀前端工程師對算法也是要有所了解的,本文總結了我們在開發、面試中經常會遇到的基礎算法,使用原生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('')實現。
3. 生成指定長度隨機字符串
PS:配合模糊等效果可以生成個驗證碼- -
function randomString(n){ var str = 'abcdefghijklmnopqrstuvwxyz0123456789'; var tmp = ''; for(var i=0;i<n;i++) tmp += str.charAt(Math.round(Math.random()*str.length)); return tmp; }
4. 統計字符串中次數最多字母
PS:利用Object中key的唯一性,利用key來進行篩選,然后計數。
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 + ':' + maxValue; }
數組操作
1. 數組去重
PS: 還是利用Object中key的唯一性,利用key來進行篩選。
function unique(arr){ var obj = {} var data = [] for(var i in arr){ if(!obj[arr[i]]){ obj[arr[i]] = true; data.push(arr[i]); } } return data; }
2. Number數組中最大差值
function getMaxProfit(arr){ var min = arr[0], max = arr[0]; for(var i=0;i<arr.length;i++){ if(arr[i]<min) min = arr[i]; if(arr[i]>max) max = arr[i]; } return max - min; }
其他常見算法
1. 階乘
1.1 非遞歸實現
function factorialize(num) { var result = 1; if(num < 0) return -1; if(num == 0 || num == 1) return 1; while(num>1) result *= num--; return result; }
1.2 遞歸實現
function factorialize(num) { var result = 1; if(num < 0) return -1; if(num == 0 || num == 1) return 1; if(num > 1){ return num*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 強行遞歸實現
function getfib(n){ if(n == 0) return 0; if(n == 1) return 1; if(n > 1){ return getfib(n-1) + getfib(n-2); } } function fibo(len){ var fibo = []; for(var i=0;i<len;i++) fibo.push(getfib(i)); return fibo; }
2.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; }
3. 二分查找
PS:二分查找又稱折半查找,是在有序數組查找中用到的較為頻繁的一種算法,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難。
3.1 非遞歸實現
function binary_search(arr, key) { var low = 0, high = arr.length - 1; while(low <= high){ var mid = parseInt((high + low) / 2); if(key == arr[mid]){ return mid; }else if(key > arr[mid]){ low = mid + 1; }else if(key < arr[mid]){ high = mid -1; } } return -1; };
3.2 遞歸實現
function binary_search3(arr, low, high, key) { if(low > high) return -1; var mid = parseInt((low + high)/2); if(key == arr[mid]) return mid; else if(key > arr[mid]) return binary_search3(arr, mid+1, high, key); else if(key < arr[mid]) return binary_search3(arr, low, mid-1, key); }
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。