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计算页面执行时间的函数
Dec 07 Javascript
修改file按钮的默认样式实现代码
Apr 23 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
Jan 26 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
Jun 20 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
Jul 23 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
Mar 08 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
Apr 21 Javascript
Vue-component全局注册实例
Sep 06 Javascript
PM2自动部署代码步骤流程总结
Dec 10 Javascript
LayUi数据表格自定义赋值方式
Oct 26 Javascript
Javascript中window.name属性详解
Nov 19 Javascript
vue-resource 拦截器interceptors使用详解
Jan 18 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访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
PHP实现的简单日历类
2014/11/29 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
Javascript学习笔记之数组的遍历和 length 属性
2014/11/23 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
微信小程序实现日历功能
2018/11/27 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
python3访问sina首页中文的处理方法
2014/02/24 Python
Python中的zip函数使用示例
2015/01/29 Python
Python的时间模块datetime详解
2017/04/17 Python
python3中的md5加密实例
2018/05/29 Python
Python实现多线程的两种方式分析
2018/08/29 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
python使用epoll实现服务端的方法
2018/10/16 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
python中PS 图像调整算法原理之亮度调整
2019/06/28 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
python搜索算法原理及实例讲解
2020/11/18 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
美国鲜花递送:UrbanStems
2021/01/04 全球购物
企业读书活动总结
2014/06/30 职场文书
消夏晚会主持词
2015/06/30 职场文书
Python中time与datetime模块使用方法详解
2022/03/31 Python
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers