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 相关文章推荐
JavaScript脚本语言在网页中的简单应用
May 13 Javascript
JS 强制设为首页的代码
Jan 31 Javascript
jquery maxlength使用说明
Sep 09 Javascript
深入了解javascript中的prototype与继承
Apr 14 Javascript
javascript eval(func())使用示例
Dec 05 Javascript
javascript继承机制实例详解
Nov 20 Javascript
JS实现仿中关村论坛评分后弹出提示效果的方法
Feb 23 Javascript
原生js实现模拟滚动条
Jun 15 Javascript
网页收藏夹显示ICO图标(代码少)
Aug 04 Javascript
canvas实现粒子时钟效果
Feb 06 Javascript
VUE兄弟组件传值操作实例分析
Oct 26 Javascript
在antd Form表单中select设置初始值操作
Nov 02 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配置文件中最常用四个ini函数
2007/03/19 PHP
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
php递归实现无限分类的方法
2015/07/28 PHP
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
javascript 新浪背投广告实现代码
2009/07/07 Javascript
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
javascript实现简单查找与替换的方法
2015/07/22 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
2015/11/02 Javascript
js实现微博发布小功能
2017/01/12 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
基于python时间处理方法(详解)
2017/08/14 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
Python实现曲线拟合的最小二乘法
2021/02/19 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
毕业生个人投资创业计划书
2014/01/04 职场文书
物业招聘计划书
2014/01/10 职场文书
会计毕业生自荐书
2014/06/12 职场文书
2014年房地产销售工作总结
2014/12/01 职场文书
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
Redis的字符串是如何实现的
2021/10/24 Redis
python利用while求100内的整数和方式
2021/11/07 Python
Linux下使用C语言代码搭建一个简单的HTTP服务器
2022/04/13 Servers