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获取单选按钮的数据
Nov 27 Javascript
javascript实现日历控件(年月日关闭按钮)
Dec 12 Javascript
javascript获取隐藏dom的宽高 具体实现
Jul 14 Javascript
jQuery随机密码生成的方法
Mar 09 Javascript
jquery实现倒计时功能
Dec 28 Javascript
Vue filters过滤器的使用方法
Jul 14 Javascript
删除table表格行的实例讲解
Sep 21 Javascript
vue.js根据代码运行环境选择baseurl的方法
Feb 28 Javascript
在vue项目中引入高德地图及其UI组件的方法
Sep 04 Javascript
vue+element-ui实现表格编辑的三种实现方式
Oct 31 Javascript
微信小程序视图控件与bindtap之间的问题的解决
Apr 08 Javascript
vue.js实现图书管理功能
Sep 24 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
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
c#中的实现php中的preg_replace
2009/12/21 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
经验几则 推荐
2006/09/05 Javascript
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
jquery实现选项卡切换代码实例
2019/05/14 jQuery
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
vue穿梭框实现上下移动
2021/01/29 Vue.js
Python3里的super()和__class__使用介绍
2015/04/23 Python
Python中random模块生成随机数详解
2016/03/10 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
Python自动化运维之Ansible定义主机与组规则操作详解
2019/06/13 Python
python命令行参数用法实例分析
2019/06/25 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
机械专业应届生求职信
2013/12/12 职场文书
会议邀请函范文
2014/01/09 职场文书
研究生毕业自我鉴定范文
2014/03/27 职场文书
《花木兰》教学反思
2014/04/09 职场文书
干部作风建设工作总结
2014/10/29 职场文书
2016教师政治学习心得体会
2016/01/23 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
Python+DeOldify实现老照片上色功能
2022/06/21 Python
Python创建SQL数据库流程逐步讲解
2022/09/23 Python