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中的end()使用方法
Jul 10 Javascript
实现局部遮罩与关闭原理及代码
Feb 04 Javascript
js 绑定键盘鼠标事件示例代码
Feb 12 Javascript
js中用window.open()打开多个窗口的name问题
Mar 13 Javascript
javascript禁止访客复制网页内容的实现代码
Aug 05 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
Jul 04 Javascript
使用OPENLAYERS3实现点选的方法
Sep 24 Javascript
详解angularjs popup-table 弹出框表格指令
Sep 20 Javascript
Vue 去除路径中的#号
Apr 19 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
Sep 25 Javascript
Vue Render函数原理及代码实例解析
Jul 30 Javascript
vue打开子组件弹窗都刷新功能的实现
Sep 21 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使用curl发送json格式数据实例
2013/12/17 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
HR vs CL BO3 第二场 2.13
2021/03/10 DOTA
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
js自定义事件代码说明
2011/01/31 Javascript
基于Jquery实现表格动态分页实现代码
2011/06/21 Javascript
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
javascript获取元素CSS样式代码示例
2013/11/28 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
深入浅析Node.js 事件循环
2015/12/20 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
es5 类与es6中class的区别小结
2020/11/09 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
详解Python3中的Sequence type的使用
2015/08/01 Python
Python中list初始化方法示例
2016/09/18 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
快速查找Python安装路径方法
2020/02/06 Python
建筑结构施工求职信
2014/07/11 职场文书
作文评语集锦
2014/12/25 职场文书
大学生助学金感谢信
2015/01/21 职场文书
高中生个性发展自我评价
2015/03/09 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python
SpringBoot Http远程调用的方法
2022/08/14 Java/Android