js星空演算法
① JS常見排序演算法
排序演算法說明:
(1)對於評述演算法優劣術語的說明
穩定 :如果a原本在b前面,而a=b,排序之後a仍然在b的前面;
不穩定 :如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;
內排序 :所有排序操作都在內存中完成;
外排序 :由於數據太大,因此把數據放在磁碟中,而排序通過磁碟和內存的數據傳輸才能進行;
時間復雜度 : 一個演算法執行所耗費的時間。
空間復雜度 : 運行完一個程序所需內存的大小。
(2)排序演算法圖片總結:
1.冒泡排序:
解析:1.比較相鄰的兩個元素,如果前一個比後一個大,則交換位置。
2.第一輪的時候最後一個元素應該是最大的一個。
3.按照步驟一的方法進行相鄰兩個元素的比較,這個時候由於最後一個元素已經是最大的了,所以最後一個元素不用比較。
2.快速排序:
解析:快速排序是對冒泡排序的一種改進,第一趟排序時將數據分成兩部分,一部分比另一部分的所有數據都要小。然後遞歸調用,在兩邊都實行快速排序。
3.插入排序:
解析:
(1) 從第一個元素開始,該元素可以認為已經被排序
(2) 取出下一個元素,在已經排序的元素序列中從後向前掃描
(3) 如果該元素(已排序)大於新元素,將該元素移到下一位置
(4) 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
(5)將新元素插入到下一位置中
(6) 重復步驟2
2.二分查找:
解析:二分查找,也為折半查找。首先要找到一個中間值,通過與中間值比較,大的放又,小的放在左邊。再在兩邊中尋找中間值,持續以上操作,直到找到所在位置為止。
(1)遞歸方法
(2)非遞歸方法
4.選擇排序:
解析:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
以此類推,直到所有元素均排序完畢。
5.希爾排序:
解析:先將整個待排序的記錄序列分割成為若乾子序列分別進行直接插入排序
6.歸並排序:
解析:歸並排序是一種穩定的排序方法。將已有序的子序列合並,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。
7.堆排序:
解析:堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是
小於(或者大於)它的父節點。
8.計數排序:
解析:計數排序使用一個額外的數組C,其中第i個元素是待排序數組A中值等於i的元素的個數。然後根據數組C來將A中的元素排到正確的位置。它只能對整數進行排序。
9.桶排序:
解析:假設輸入數據服從均勻分布,將數據分到有限數量的桶里,每個桶再分別排序(有可能再使用別的排序演算法或是以遞歸方式繼續使用桶排序進行排
10.基數排序:
解析:基數排序是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先順序順序的,先按低優先順序排序,再按高優
先級排序。最後的次序就是高優先順序高的在前,高優先順序相同的低優先順序高的在前。基數排序基於分別排序,分別收集,所以是穩定的。
基數排序 vs 計數排序 vs 桶排序
這三種排序演算法都利用了桶的概念,但對桶的使用方法上有明顯差異:
基數排序:根據鍵值的每位數字來分配桶 計數排序:每個桶只存儲單一鍵值 桶排序:每個桶存儲一定范圍的數值
② JS版本 排序演算法
1.三種排序--冒泡,選擇排序,快排
2.二分查找(非遞歸版本)
3.鏈表反轉
③ 求js中顏色值變淺的演算法,類似於下圖
首先你的了解顏色的概念
下面我簡單介紹下顏色概念在32位系統上我們所看到的顏色由RGB三原色顯示再加上一個透明度通道就形成了多種多樣的顏色
多的我就不多說了下面直接寫一份演示代碼
<!DOCTYPEhtml>
<html>
<head>
<title>test</title>
<style>
.tsetDiv{
width:40px;
height:40px;
border-radius:100%;
font-size:0;
display:inline-block;
margin-left:10px;
vertical-align:middle;
}
#boxF{
width:300px;
font-size:0;
height:auto;
}
</style>
</head>
<body>
<divid="boxF"></div>
<scripttype="text/javascript">
varboxf=document.getElementById("boxF");
vardivC=null;
varr=0;
varg=0;
varb=0;
for(vari=0;i<10;i++){
for(varj=0;j<10;j++){
divC=document.createElement("div");
divC.style.backgroundColor="rgb("+r+","+g+","+b+")";
divC.setAttribute("class","tsetDiv");
boxf.appendChild(divC);
}
//修改rgb加的不同值可以得到不同的效果rgb最大值為255所以不用擔心超過不顯示
r+=15;
g+=25;
b+=35;
}
</script>
</body>
</html>
運行效果為下圖
④ js中常見的數據加密與解密的方法
加密在我們前端的開發中也是經常遇見的。本文只把我們常用的加密方法進行總結。不去糾結加密的具體實現方式(密碼學,太龐大了)。
常見的加密演算法基本分為這幾類,
RSA加密:RSA加密演算法是一種非對稱加密演算法。在公開密鑰加密和電子商業中RSA被廣泛使用。(這才是正經的加密演算法)
非對稱加密演算法:非對稱加密演算法需要兩個密鑰:公開密鑰(publickey:簡稱公鑰)和私有密鑰(privatekey:簡稱私鑰)。公鑰與私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種演算法叫作非對稱加密演算法。
DES全稱為Data Encryption Standard,即數據加密標准,是一種使用密鑰加密的塊演算法
DES演算法的入口參數有三個:Key、Data、Mode。其中Key為7個位元組共56位,是DES演算法的工作密鑰;Data為8個位元組64位,是要被加密或被解密的數據;Mode為DES的工作方式,有兩種:加密或解密。
AES這個標准用來替代原先的DES
DES/AES我們合並在一起介紹其用法和特點
Base64是一種用64個字元來表示任意二進制數據的方法。base64是一種編碼方式而不是加密演算法。只是看上去像是加密而已(嚇唬人)。
⑤ 前端演算法入門一:刷演算法題常用的JS基礎掃盲
此篇屬於前端演算法入門系列的第一篇,主要介紹常用的 數組方法 、 字元串方法 、 遍歷方法 、 高階函數 、 正則表達式 以及相關 數學知識 。
在尾部追加,類似於壓棧,原數組會變。
在尾部彈出,類似於出棧,原數組會變。數組的 push & pop 可以模擬常見數據結構之一:棧。
在頭部壓入數據,類似於入隊,原數組會變。
在頭部彈出數據,原數組會變。數組的 push(入隊) & shift(出隊) 可以模擬常見數據結構之一:隊列。
concat會在當前數組尾部拼接傳入的數組,然後返回一個新數組,原數組不變。
在數組中尋找該值,找到則返回其下標,找不到則返回-1。
在數組中尋找該值,找到則返回true,找不到則返回false。
將數組轉化成字元串,並返回該字元串,不傳值則默認逗號隔開,原數組不變。
翻轉原數組,並返回已完成翻轉的數組,原數組改變。
從start 開始截取到end,但是不包括end
可參考 MDN:Sort
將數組轉化成字元串,並返回該字元串,逗號隔開,原數組不變。
返回指定索引位置處的字元。類似於數組用中括弧獲取相應下標位置的數據。
類似數組的concat(),用來返回一個合並拼接兩個或兩個以上字元串。原字元串不變。
indexOf,返回一個字元在字元串中首次出現的位置,lastIndexOf返回一個字元在字元串中最後一次出現的位置。
提取字元串的片斷,並把提取的字元串作為新的字元串返回出來。原字元串不變。
使用指定的分隔符將一個字元串拆分為多個子字元串數組並返回,原字元串不變。
match()方法可在字元串內檢索指定的值,或找到一個或多個正則表達式的匹配,並返回一個包含該搜索結果的數組。
注意事項 :如果match方法沒有找到匹配,將返回null。如果找到匹配,則 match方法會把匹配到以數組形式返回,如果正則規則未設置全局修飾符g,則 match方法返回的數組有兩個特性:input和index。input屬性包含整個被搜索的字元串。index屬性包含了在整個被搜索字元串中匹配的子字元串的位置。
replace接收兩個參數,參數一是需要替換掉的字元或者一個正則的匹配規則,參數二,需要替換進去的字元,仔實際的原理當中,參數二,你可以換成一個回調函數。
在目標字元串中搜索與正則規則相匹配的字元,搜索到,則返回第一個匹配項在目標字元串當中的位置,沒有搜索到則返回一個-1。
toLowerCase把字母轉換成小寫,toUpperCase()則是把字母轉換成大寫。
includes、startsWith、endsWith,es6的新增方法,includes 用來檢測目標字元串對象是否包含某個字元,返回一個布爾值,startsWith用來檢測當前字元是否是目標字元串的起始部分,相對的endwith是用來檢測是否是目標字元串的結尾部分。
返回一個新的字元串對象,新字元串等於重復了指定次數的原始字元串。接收一個參數,就是指定重復的次數。原字元串不變。
最常用的for循環,經常用的數組遍歷,也可以遍歷字元串。
while、do while主要的功能是,當滿足while後邊所跟的條件時,來執行相關業務。這兩個的區別是,while會先判斷是否滿足條件,然後再去執行花括弧裡面的任務,而do while則是先執行一次花括弧中的任務,再去執行while條件,判斷下次還是否再去執行do裡面的操作。也就是說 do while至少會執行一次操作 .
拷貝一份遍歷原數組。
for…of是ES6新增的方法,但是for…of不能去遍歷普通的對象, for…of的好處是可以使用break跳出循環。
面試官:說一下 for...in 和 for...of 區別?
返回一個布爾值 。當我們需要判定數組中的元素是否滿足某些條件時,可以使用every / some。這兩個的區別是,every會去判斷判斷數組中的每一項,而 some則是當某一項滿足條件時返回。
rece 從左到右將數組元素做「疊加」處理,返回一個值。receRight 從右到左。
Object.keys方法的參數是一個對象,返回一個數組。該數組的成員都是該對象自身的(而不是繼承的)所有屬性名,且只返回可枚舉的屬性。
Object.getOwnPropertyNames方法與Object.keys類似,也是接受一個對象作為參數,返回一個數組,包含了該對象自身的所有屬性名。但它能返回不可枚舉的屬性。
這里羅列一些我在刷演算法題中遇到的正則表達式,如果有時間可認真學一下正則表達式不要背。
持續更新,敬請期待……
若一個正整數無法被除了1 和它自身之外的任何自然數整除,則稱該數為質數(或素數),否則稱該正整數為合數。
持續更新,敬請期待……
作者:擺草猿
鏈接:https://juejin.cn/post/7087134135193436197