JS常用算法实现代码


Posted in Javascript onNovember 14, 2016

本文的主要目的是帮助大家熟悉熟悉常用的几个算法用JS的实现,具体内容如下

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js跨域和ajax 跨域问题的实现思路
Sep 05 Javascript
Jquery cookie操作代码
Mar 14 Javascript
js的写法基础分析
Jan 17 Javascript
原生js实现给指定元素的后面追加内容
Apr 10 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
May 12 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
Feb 27 Javascript
AngularJS之自定义服务详解(factory、service、provider)
Apr 14 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
Sep 18 Javascript
vue中添加mp3音频文件的方法
Mar 02 Javascript
Vue动态获取width的方法
Aug 22 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
Sep 23 Javascript
使用TS来编写express服务器的方法步骤
Oct 29 Javascript
node.js缺少mysql模块运行报错的解决方法
Nov 13 #Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
Nov 13 #Javascript
JS实现的几个常用算法
Nov 12 #Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
Nov 12 #Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
Nov 12 #Javascript
Angular学习笔记之angular的$filter服务浅析
Nov 12 #Javascript
使用JS代码实现点击按钮下载文件
Nov 12 #Javascript
You might like
一些星际专用术语解释
2020/03/04 星际争霸
PHP 存储文本换行实现方法
2010/01/05 PHP
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
chrome调试javascript详解
2015/10/21 Javascript
javascript中字体浮动效果的简单实例演示
2015/11/18 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
详解jenkins自动化部署vue
2019/05/14 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
JS如何把字符串转换成json
2020/02/21 Javascript
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
Python中类的初始化特殊方法
2017/12/01 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
人事行政主管岗位职责
2013/12/22 职场文书
学术会议邀请函范文
2014/01/22 职场文书
高一政治教学反思
2014/01/28 职场文书
交通事故私了协议书
2014/04/16 职场文书
高中生评语大全
2014/04/25 职场文书
优秀党员先进材料
2014/12/18 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电
Redis高可用集群redis-cluster详解
2022/03/20 Redis
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL