视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JS实现的几个常用算法
2020-11-27 20:28:52 责编:小采
文档

(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 = 'qwertyuiopasdfghjklzxcvbnm12345670';
 // 定义一个临时变量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;
}

下载本文
显示全文
专题