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 相关文章推荐
JS中剪贴板兼容性、判断复制成功或失败
Mar 09 Javascript
jQuery live( type, fn ) 委派事件实现
Oct 11 Javascript
JS求平均值的小例子
Nov 29 Javascript
js控制input框只读实现示例
Jan 20 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
Jan 26 Javascript
删除javascript中注释语句的正则表达式
Jun 11 Javascript
jquery实现可拖拽弹出层特效
Jan 04 Javascript
jQuery子属性过滤选择器用法分析
Feb 10 Javascript
炫酷的js手风琴效果
Oct 13 Javascript
Javascript中call,apply,bind方法的详解与总结
Dec 12 Javascript
js提取中文拼音首字母的封装工具类
Mar 12 Javascript
基于canvas实现手写签名(vue)
May 21 Javascript
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
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
PHP与jquery实时显示网站在线人数实例详解
2016/12/02 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
js将long日期格式转换为标准日期格式实现思路
2013/04/07 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
详解Vue单元测试Karma+Mocha学习笔记
2018/01/31 Javascript
微信小程序实现上传图片裁剪图片过程解析
2019/08/22 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
浅谈Python爬取网页的编码处理
2016/11/04 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
Python中的Django基本命令实例详解
2018/07/15 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
寒假思想汇报
2014/01/10 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
2014年清明节寄语
2014/04/03 职场文书
土建工程师岗位职责
2014/06/10 职场文书
酒店端午节活动方案
2014/08/26 职场文书
工程款申请报告
2015/05/15 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android