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 相关文章推荐
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
Jan 11 Javascript
Jquery的hover方法让鼠标经过li时背景变色
Sep 06 Javascript
jQuery Form 页面表单提交的小例子
Nov 15 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
Feb 03 Javascript
整理一下常见的IE错误
Nov 18 Javascript
jquery中用函数来设置css样式
Dec 22 Javascript
基于datepicker定义自己的angular时间组件的示例
Mar 14 Javascript
vue cli2.0单页面title修改方法
Jun 07 Javascript
Vue传参一箩筐(页面、组件)
Apr 04 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
Apr 29 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
Oct 26 jQuery
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
Nov 13 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
9个实用的PHP代码片段分享
2015/01/22 PHP
PHP设置进度条的方法
2015/07/08 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
js实现自定义进度条效果
2017/03/15 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
WebSocket的通信过程与实现方法详解
2018/04/29 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
python版大富翁源代码分享
2018/11/19 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
python中tab键是什么意思
2020/06/18 Python
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
ProForm英国站点:健身房和健身器材网上商店
2019/06/05 全球购物
职业生涯规划怎么写
2013/12/29 职场文书
火锅店创业计划书范文
2014/02/02 职场文书
租房协议书范本
2014/04/09 职场文书
党性分析自查总结
2014/10/14 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
解决Python字典查找报Keyerror的问题
2021/05/26 Python
python中redis包操作数据库的教程
2022/04/19 Python