JS实现的几个常用算法


Posted in Javascript onNovember 12, 2016

(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;
}

以上所述是小编给大家介绍的JS实现的几个常用算法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
使用Post提交时须将空格转换成加号的解释
Jan 14 Javascript
jCallout 轻松实现气泡提示功能
Sep 22 Javascript
jquery获取css中的选择器(实例讲解)
Dec 02 Javascript
jQuery 回车事件enter使用示例
Feb 18 Javascript
JavaScript实现生成GUID(全局统一标识符)
Sep 05 Javascript
js表单提交和submit提交的区别实例分析
Dec 10 Javascript
JavaScript中数组的各种操作的总结(必看篇)
Feb 13 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
Jul 27 Javascript
webpack配置之后端渲染详解
Oct 26 Javascript
微信小程序实现星级评价
Nov 20 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
May 13 Javascript
vue css 相对路径导入问题级踩坑记录
Jun 05 Vue.js
AngularJS操作键值对象类似java的hashmap(填坑小结)
Nov 12 #Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
Nov 12 #Javascript
Angular学习笔记之angular的$filter服务浅析
Nov 12 #Javascript
使用JS代码实现点击按钮下载文件
Nov 12 #Javascript
JavaScript中浅讲ajax图文详解
Nov 11 #Javascript
javascript 实现动态侧边栏实例详解
Nov 11 #Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
Nov 11 #Javascript
You might like
php下连接mssql2005的代码
2011/01/17 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
[原创]图片分页查看
2006/08/28 Javascript
js一组验证函数
2008/12/20 Javascript
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
2011/05/02 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
python实现排序算法
2014/02/14 Python
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
Python通过OpenCV的findContours获取轮廓并切割实例
2018/01/05 Python
pygame实现简易飞机大战
2018/09/11 Python
Python3爬虫全国地址信息
2019/01/05 Python
Python绘制动态水球图过程详解
2020/06/03 Python
Python jieba库分词模式实例用法
2021/01/13 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
财务部副经理岗位职责
2014/03/14 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
2014年教务处工作总结
2014/12/03 职场文书
保证书格式
2015/01/16 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
任命书格式模板
2015/09/22 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
初中生物教学反思
2016/02/20 职场文书
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python