JS常用算法实现代码


Posted in Javascript onNovember 14, 2016

本文的主要目的是帮助大家熟悉熟悉常用的几个算法用JS的实现,具体内容如下

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery之拖拽插件实现代码
Apr 14 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
Mar 12 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
Dec 12 Javascript
JavaScript中的Truthy和Falsy介绍
Jan 01 Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 Javascript
JQuery实现图片轮播效果
May 08 jQuery
vue.js模仿京东省市区三级联动的选择组件实例代码
Nov 22 Javascript
JavaScript+H5实现微信摇一摇功能
May 23 Javascript
jQuery实现ajax的嵌套请求案例分析
Feb 16 jQuery
JavaScript数组排序小程序实现解析
Jan 13 Javascript
JavaScript实现alert弹框效果
Nov 19 Javascript
Javascript实现关闭广告效果
Jan 29 Javascript
node.js缺少mysql模块运行报错的解决方法
Nov 13 #Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
Nov 13 #Javascript
JS实现的几个常用算法
Nov 12 #Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
Nov 12 #Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
Nov 12 #Javascript
Angular学习笔记之angular的$filter服务浅析
Nov 12 #Javascript
使用JS代码实现点击按钮下载文件
Nov 12 #Javascript
You might like
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
php中mt_rand()随机数函数用法
2014/11/24 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
2016/12/15 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
2019/10/17 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
jquery 获取json数据实现代码
2009/04/27 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
2016/06/01 Javascript
深入探讨Vue.js组件和组件通信
2016/09/12 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
2020/03/19 Javascript
vue2.x数组劫持原理的实现
2020/04/19 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
python win32 简单操作方法
2017/05/25 Python
python调用staf自动化框架的方法
2018/12/26 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
突袭HTML5之Javascript API扩展3—本地存储全新体验
2013/01/31 HTML / CSS
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
Hotels.com印度:酒店预订
2019/05/11 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
大学应届毕业生个人求职信
2013/09/23 职场文书
运动会解说词50字
2014/01/18 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
教师档案管理制度
2014/01/23 职场文书
通信工程求职信
2014/07/16 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
独生子女证明范本
2015/06/19 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
Html5调用企业微信的实现
2021/04/16 HTML / CSS
JavaScript 数组去重详解
2021/09/15 Javascript
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript