JS常用演算法實現代碼,js演算法代碼
本文的主要目的是協助大家熟悉熟悉常用的幾個演算法用JS的實現,具體內容如下
(1)數組去重
原理:定義一個對象obj,然後把數組元素作為obj的屬性名稱,利用屬性名稱是否重複進行判重
var unique = function(arr){ let obj = {}; let newArr = []; arr.forEach(function(x){ if(!obj[x]){ //如果對象中沒有該元素對應的屬性 obj[x] = true; newArr.push(x); } }); return newArr;}
(2)使用快速排序演算法對數組進行排序
這裡麵包括兩種效果,一種是利用快排的特性實現了去重快排,另一種是不去重的快排。
原理:獲得目標數組,選定一個元素最為標誌位,遍曆剩餘的元素,比標誌位大放右邊,比標誌位小放左邊。
特別注意:還有與標誌位相等的元素,如果你儲存相等的元素,就實現了去重,如果儲存了,就不去重。
var quickSort = function(arr){ if(arr.length <= 1){ return arr; } //定義一個左數組,定義一個右數組 let leftArr = []; let rightArr = []; //選定一個參照值 let tag = arr[0]; /* * 使用如下方式判斷,會把重複元素去掉,就實現了快排的同時去重 */ for(let i = 0; i < arr.length; i++){ if(arr[i] < tag){ //將比tag小的元素放在左數組中 leftArr.push(arr[i]); } if(arr[i] > tag){ //將比tag大的元素放在右數組中 rightArr.push(arr[i]); } } /* * 使用如下方式就是使用快排進行排序,不去重 */ for(let i = 1; i < arr.length; i++){ if(arr[i] < tag){ //將比tag小的元素放在左數組中 leftArr.push(arr[i]); }else{ //將比tag大的元素放在右數組中 rightArr.push(arr[i]); } } //遞迴調用 return [].concat(quickSort(leftArr),[tag],quickSort(rightArr));}
(3)統計字串中出現次數最多的字元
原理:這個和數組去重類似,也是利用一個對象obj,將數組元素作為對象的屬性名稱,如果不存在該屬性名稱,則值賦為1,如果存在,則值加1。
var maxShowTimes = function(str){ // 建立一個用於判重的對象 let obj = {}; // 判斷字串是否為空白或只有一個元素 if(str.length <= 1){ return str.length === 0?'字串不可為空':str; } // 利用String的charAt()方法擷取各個字元 for(let i = 0; i <= str.length; i++){ if(!obj[str.charAt(i)]){ //如果不存在 obj[str.charAt(i)] = 1; }else{ //如果存在 obj[str.charAt(i)] += 1; } } // 在obj對象中尋找值最大的那個屬性 let maxChar = ''; let maxTimes = 0; for(var k in obj){ if(obj[k] > maxTimes){ maxChar = k; maxTimes = obj[k]; } } return maxChar;}
(4)不藉助第三個變數實現兩個變數交換值
原理:就是一個變數替換,思路很巧妙,只能用於數位交換。
var swap = function(a,b){ if(a === b){ return [a,b]; } b = b - a; // 此處的 b - a中的b和a的值是最初的值 a = a + b; // a = a + b -a; 實現了將b的值賦給a b = a - b; // b = a - (b - a) = 2a - b 相當於 2b = 2a;實現了將a的值賦給b return [a,b];}
(5)求一個數組的最大差值
原理:遍曆一次數組,找到最大值和最小值,返回差值
var getMaxProfit = function(arr){ // 定義兩個變數,分別存貯最大值和最小值 let maxNum = arr[0]; let minNum = arr[0]; for(let i = 0; i < arr.length; i++){ if(arr[i] > maxNum){ maxNum = arr[i]; } if(arr[i] < minNum){ minNum = arr[i]; } } return maxNum - minNum;}
(6)擷取任意長度的隨機字串
原理:可以手動指定字元庫及隨機字元長度n,利用Math.floor()和Math.random()兩個方法實現擷取隨機字元。
var getRandomString = function(n){ // 定義隨機字串的字元庫 let str = 'qwertyuiopasdfghjklzxcvbnm1234567890'; // 定義一個臨時變數tmp儲存產生的隨機字串 let tmp = ''; //擷取str的長度 let len = str.length; // 產生一個長度為n的隨機字串 for(let i = 0; i < n; i++){ tmp += str.charAt(Math.floor(Math.random() * len)); } return tmp;}
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。