前言
-
因爲平時在寫代碼的過程中,有些算法會經常重複寫,比如數組去重、數組抽取隨機值等!雖然這些不是很難的邏輯,但是每次剛開始遇到需求的時候,還是需要琢磨一些時間才能想出來,所以此文檔把這些常見算法的思想記錄下來,以便下次再遇到的時候不會手腳無措了!
-
這篇文檔不考慮es6等語法,也不考慮Array自帶的一些過濾方法!
數組去重
-
我們這裏不考慮數組上的一個自帶的過濾算法,比如map、filter等方法!數組去重的關鍵是需要一箇中間數組來存數組來幫助實現數組去重!
-
方法一:
var arr = [1,2,3,1,1,1,1];
function toHeavy(array){
//這是一個緩存對象,用來實現過濾到重複的數據
var cache = {};
//定義一箇中間數組,用來實現當容器
var cacheArr = [];
for(var i = 0,len = array.length;i<len;i++){
if(!cache[array[i]]){
cacheArr.push(array[i]);
cache[array[i]] = array[i];
};
};
return cacheArr;
};
arr = toHeavy(arr);//arr == [1,2,3]
- 方法二:
//其實思想跟第一個差不多
var arr = [1,2,3,1,1,1,1,1,1];
function toHeavy(array){
var cache = [];
for(var i = 0,len = array.length;i<len;i++){
//用閉包,防止isHeavy向外部暴露,當然如果用es6的話,可以用let對isHeavy進行聲明也能達到同樣的目的
//因爲js中沒有塊級作用域
(function(){
var isHeavy = false;
for(var j = 0,_len = cache.length;j<_len;j++){
if(cache[j] == array[i]){
isHeavy = true;
break;
};
};
if(!isHeavy){
//如果不是重複的,那麼就執行把當前值推送的cache裏面
cache.push(array[i]);
};
})();
};
return cache;
};
arr = toHeavy(arr);
最後說一句,現實中的數據肯定不會這麼簡單,可能會是一個稍微複雜的數據,要給這些數組去重你也不要被嚇住,其實原理是一樣的,只是你被迷惑了而已!
在一個數組中隨機抽取一部分值
- 這個算法的關鍵要使用Math.random,不說了直接上代碼:
var arr = ['小明','小紅','小陳','小於','小蘭','小法','小p','小張','小鎮','小王','傻逼','慫逼'];
function getArr(num,array){
//num表示要去多少個,它不能大於要取的那個數組的最大長度,如果超過了那麼就等於它的長度
var aLength = array.length;
if(num>=aLength){
num = aLength;
};
var cacheArr = [];
//我們用一個數組保存原來的數組
//記住千萬能直接賦值,因爲數組是一個引用,這樣不能保持原來的數組
//這裏也可以用originArr = array.slice()
var originArr = (function(){
var arr = [];
for(var i = 0,len = array.length;i<len;i++){
arr.push(array[i]);
};
return arr;
})();
for(var i = 0;i<num;i++){
//array.length不能寫成上面的aLength,因爲aLength是固定的值,而array.length隨着array的改變是自動更新的
//Math.random() * array.length得到的是一個介於長度和零之間的一個值,包括0但不包含長度值
//我們算出的是一個浮點值,所以我們必須把它轉化成整數
//因爲不能超過最大長度值,所以應該向下取整
var _index = Math.floor(Math.random() * array.length);
cacheArr.push(array[_index]);
//記住一定,取出來之後,一定刪除原來位置上的數組值
//要不然數組更新不了
array.splice(_index,1);
};
//取回原來的數組
array = originArr;
console.log(array);
return cacheArr;
};
var brr = getArr(5,arr);
得到某個區間的字母組成的數組
- 這裏主要應用兩個方法,一個字符串的charCodeAt和String上的一個靜態方法fromCharCode。其思想主要是:先得到這個區間開頭字母和結束字母的數字表示,然後就可以在這個區間內做一個循環,並且得到這個區間字母的數字表示,最後把數字傳喚成字母依次push到數組裏面返回。直接上代碼:
function getArrForAlphabet(startLetter,endLetter){
//var regExp = /^[a-zA-Z]$/gi;
var regExp = new RegExp("^[a-zA-Z]$");
if(!regExp.test(startLetter) || !regExp.test(endLetter)){
//console.log(regExp.test(startLetter));
//console.log(regExp.test(endLetter));
console.log('請傳入字母!');
return false;
};
//i是得到開始字母的數字表示,j得到結束字母的數字表示
var i = startLetter.charCodeAt(0),j = endLetter.charCodeAt(0);
//定義一個數組用於取出將來的字母
var arr = [];
//這裏取<=符號是因爲要取出結束的字母
for(;i<=j;i++){
//fromCharCode是String上的一個靜態方法,用於將一個數字轉換成對應的字母
var letter = String.fromCharCode(i);
arr.push(letter);
};
//記得最後返回arr
return arr;
};
加Java架構師進階交流羣獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。
性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限
都是大牛帶飛 讓你少走很多的彎路的 羣號是: 558787436 對了 小白勿進 最好是有開發經驗
注:加羣要求
1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。
5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶着大家全面、科學地建立自己的技術體系和技術認知!