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ì)象中沒(méi)有該元素對(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ù)組去重類(lèi)似,也是利用一個(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)獲取任意長(zhǎng)度的隨機(jī)字符串
原理:可以手動(dòng)指定字符庫(kù)及隨機(jī)字符長(zhǎng)度n,利用Math.floor()和Math.random()兩個(gè)方法實(shí)現(xiàn)獲取隨機(jī)字符。
var getRandomString = function(n){
// 定義隨機(jī)字符串的字符庫(kù)
let str = 'qwertyuiopasdfghjklzxcvbnm1234567890';
// 定義一個(gè)臨時(shí)變量tmp存儲(chǔ)生成的隨機(jī)字符串
let tmp = '';
//獲取str的長(zhǎng)度
let len = str.length;
// 生成一個(gè)長(zhǎng)度為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ì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的,在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
js canvas實(shí)現(xiàn)擦除動(dòng)畫(huà)
在移動(dòng)設(shè)備上將某張圖片擦掉顯示另一張圖片,利用canvas來(lái)實(shí)現(xiàn)這篇文章就為大家詳細(xì)介紹了js canvas實(shí)現(xiàn)擦除動(dòng)畫(huà)的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-07-07
JS實(shí)現(xiàn)定時(shí)任務(wù)每隔N秒請(qǐng)求后臺(tái)setInterval定時(shí)和ajax請(qǐng)求問(wèn)題
這篇文章主要介紹了JS實(shí)現(xiàn)定時(shí)任務(wù)每隔N秒請(qǐng)求后臺(tái)setInterval定時(shí)和ajax請(qǐng)求 的相關(guān)資料,需要的朋友可以參考下2017-10-10
window.setInterval()方法的定義和用法及offsetLeft與style.left的區(qū)別
window.setInterval()方法可以按照指定的周期執(zhí)行來(lái)執(zhí)行一段程序。周期是以毫秒為單位的,本文給大家介紹window.setInterval()方法的定義和用法,感興趣的朋友參考下2015-11-11
利用JavaScript做數(shù)獨(dú)的完整實(shí)現(xiàn)過(guò)程
數(shù)獨(dú)游戲是在一個(gè)9*9的方格中進(jìn)行填數(shù)字的游戲,需要滿(mǎn)足的規(guī)則是每行每列和每個(gè)子九宮格都是1~9的不重復(fù)數(shù)字,下面這篇文章主要給大家介紹了關(guān)于如何利用JavaScript做數(shù)獨(dú)的相關(guān)資料,需要的朋友可以參考下2021-09-09
JS實(shí)現(xiàn)為表格動(dòng)態(tài)添加標(biāo)題的方法
這篇文章主要介紹了JS實(shí)現(xiàn)為表格動(dòng)態(tài)添加標(biāo)題的方法,涉及javascript中createCaption方法添加標(biāo)題的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03

