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 相关文章推荐
JS OffsetParent属性深入解析
Jan 13 Javascript
js父页面与子页面不同时显示的方法
Oct 16 Javascript
详解JavaScript中的every()方法
Jun 08 Javascript
使用AngularJS对路由进行安全性处理的方法
Jun 18 Javascript
jquery结婚电子请柬特效源码分享
Aug 21 Javascript
微信JSSDK上传图片
Aug 23 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
Sep 14 Javascript
JS基于Mootools实现的个性菜单效果代码
Oct 21 Javascript
微信小程序wepy框架笔记小结
Aug 08 Javascript
对layui中表单元素的使用详解
Aug 15 Javascript
CryptoJS中AES实现前后端通用加解密技术
Dec 18 Javascript
基于Vue 实现一个中规中矩loading组件
Apr 03 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
php线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
浅析php数据类型转换
2014/01/09 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
JavaScript访问样式表代码
2010/10/15 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
python实现最小二乘法线性拟合
2019/07/19 Python
python gdal安装与简单使用
2019/08/01 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
高中生学习总结的自我评价范文
2013/10/13 职场文书
寄语是什么意思
2014/04/10 职场文书
1亿有多大教学反思
2014/05/01 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
社保转移委托书范本
2014/10/08 职场文书
2014年教师教学工作总结
2014/11/08 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
党员学习中国梦心得体会
2016/01/05 职场文书