JS實(shí)現(xiàn)的幾個(gè)常用算法
(1)數(shù)組去重
原理:定義一個(gè)對(duì)象obj,然后把數(shù)組元素作為obj的屬性名,利用屬性名是否重復(fù)進(jìn)行判重
var unique = function(arr){ let obj = {}; let newArr = []; arr.forEach(function(x){ if(!obj[x]){ //如果對(duì)象中沒有該元素對(duì)應(yīng)的屬性 obj[x] = true; newArr.push(x); } }); return newArr; }
(2)使用快速排序算法對(duì)數(shù)組進(jìn)行排序
這里面包括兩種效果,一種是利用快排的特性實(shí)現(xiàn)了去重快排,另一種是不去重的快排。
原理:獲得目標(biāo)數(shù)組,選定一個(gè)元素最為標(biāo)志位,遍歷剩余的元素,比標(biāo)志位大放右邊,比標(biāo)志位小放左邊。
特別注意:還有與標(biāo)志位相等的元素,如果你存儲(chǔ)相等的元素,就實(shí)現(xiàn)了去重,如果存儲(chǔ)了,就不去重。
var quickSort = function(arr){ if(arr.length <= 1){ return arr; } //定義一個(gè)左數(shù)組,定義一個(gè)右數(shù)組 let leftArr = []; let rightArr = []; //選定一個(gè)參照值 let tag = arr[0]; /* * 使用如下方式判斷,會(huì)把重復(fù)元素去掉,就實(shí)現(xiàn)了快排的同時(shí)去重 */ for(let i = 0; i < arr.length; i++){ if(arr[i] < tag){ //將比tag小的元素放在左數(shù)組中 leftArr.push(arr[i]); } if(arr[i] > tag){ //將比tag大的元素放在右數(shù)組中 rightArr.push(arr[i]); } } /* * 使用如下方式就是使用快排進(jìn)行排序,不去重 */ for(let i = 1; i < arr.length; i++){ if(arr[i] < tag){ //將比tag小的元素放在左數(shù)組中 leftArr.push(arr[i]); }else{ //將比tag大的元素放在右數(shù)組中 rightArr.push(arr[i]); } } //遞歸調(diào)用 return [].concat(quickSort(leftArr),[tag],quickSort(rightArr)); }
(3)統(tǒng)計(jì)字符串中出現(xiàn)次數(shù)最多的字符
原理:這個(gè)和數(shù)組去重類似,也是利用一個(gè)對(duì)象obj,將數(shù)組元素作為對(duì)象的屬性名,如果不存在該屬性名,則值賦為1,如果存在,則值加1。
var maxShowTimes = function(str){ // 創(chuàng)建一個(gè)用于判重的對(duì)象 let obj = {}; // 判斷字符串是否為空或只有一個(gè)元素 if(str.length <= 1){ return str.length === 0?'字符串不能為空':str; } // 利用String的charAt()方法獲取各個(gè)字符 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對(duì)象中尋找值最大的那個(gè)屬性 let maxChar = ''; let maxTimes = 0; for(var k in obj){ if(obj[k] > maxTimes){ maxChar = k; maxTimes = obj[k]; } } return maxChar; }
(4)不借助第三個(gè)變量實(shí)現(xiàn)兩個(gè)變量交換值
原理:就是一個(gè)變量替換,思路很巧妙,只能用于數(shù)字的交換。
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; 實(shí)現(xiàn)了將b的值賦給a b = a - b; // b = a - (b - a) = 2a - b 相當(dāng)于 2b = 2a;實(shí)現(xiàn)了將a的值賦給b return [a,b]; }
(5)求一個(gè)數(shù)組的最大差值
原理:遍歷一次數(shù)組,找到最大值和最小值,返回差值
var getMaxProfit = function(arr){ // 定義兩個(gè)變量,分別存貯最大值和最小值 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)獲取任意長度的隨機(jī)字符串
原理:可以手動(dòng)指定字符庫及隨機(jī)字符長度n,利用Math.floor()和Math.random()兩個(gè)方法實(shí)現(xiàn)獲取隨機(jī)字符。
var getRandomString = function(n){ // 定義隨機(jī)字符串的字符庫 let str = 'qwertyuiopasdfghjklzxcvbnm1234567890'; // 定義一個(gè)臨時(shí)變量tmp存儲(chǔ)生成的隨機(jī)字符串 let tmp = ''; //獲取str的長度 let len = str.length; // 生成一個(gè)長度為n的隨機(jī)字符串 for(let i = 0; i < n; i++){ tmp += str.charAt(Math.floor(Math.random() * len)); } return tmp; }
以上所述是小編給大家介紹的JS實(shí)現(xiàn)的幾個(gè)常用算法,希望對(duì)大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的,在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
JavaScript實(shí)現(xiàn)2種常見的抽獎(jiǎng)效果實(shí)例代碼
抽獎(jiǎng)系統(tǒng)是一種常見的功能,可以用于各種活動(dòng)和網(wǎng)站,這篇文章主要給大家介紹了關(guān)于JavaScript實(shí)現(xiàn)2種常見的抽獎(jiǎng)效果的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01javaScript 刪除確認(rèn)實(shí)現(xiàn)方法小結(jié)
因?yàn)閷?duì)于內(nèi)容的刪除是件很重要的事,所以一般的系統(tǒng)中,都需要?jiǎng)h除確認(rèn)一下,以免誤刪,具體的方法如下,大家可以參考下。2009-12-12基于原生js實(shí)現(xiàn)九宮格算法代碼實(shí)例
這篇文章主要介紹了基于原生js實(shí)現(xiàn)九宮格算法代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07更優(yōu)雅的微信小程序骨架屏實(shí)現(xiàn)詳解
這篇文章主要介紹了更優(yōu)雅的微信小程序骨架屏實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08layUI的驗(yàn)證碼功能及校驗(yàn)實(shí)例
今天小編就為大家分享一篇layUI的驗(yàn)證碼功能及校驗(yàn)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10EditPlus注冊(cè)碼生成器(js代碼實(shí)現(xiàn))
在線的EditPlus注冊(cè)碼生成器,看了看還真是,在這里exe的注冊(cè)機(jī)病毒太多,純js的在線注冊(cè)機(jī)可就放心了,感興趣的各位可以參考下哈,希望可以幫助到你2013-03-03layui 上傳插件 帶預(yù)覽 非自動(dòng)上傳功能的實(shí)例(非常實(shí)用)
今天小編就為大家分享一篇layui 上傳插件 帶預(yù)覽 非自動(dòng)上傳功能的實(shí)例(非常實(shí)用),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09關(guān)于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
下面小編就為大家?guī)硪黄P(guān)于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06微信小程序canvas動(dòng)態(tài)時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了微信小程序canvas動(dòng)態(tài)時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10javascript 多種搜索引擎集成的頁面實(shí)現(xiàn)代碼
這個(gè)頁面是為了方便自己同時(shí)使用多種搜索引擎(呵呵我用其作默認(rèn)主頁),在IE5/IE6/FireFox下均運(yùn)行正常,效果如下圖2010-01-01