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 相关文章推荐
两个数组去重的JS代码
Dec 04 Javascript
js中小数转换整数的方法
Jan 26 Javascript
jquery动态添加元素事件失效问题解决方法
May 23 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
Mar 18 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
Apr 13 jQuery
基于rem的移动端响应式适配方案(详解)
Jul 07 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
Jul 17 Javascript
JavaScript变量类型以及变量作用域详解
Aug 14 Javascript
js+SVG实现动态时钟效果
Jul 14 Javascript
详解vue如何使用rules对表单字段进行校验
Oct 17 Javascript
新手快速上手webpack4打包工具的使用详解
Jan 28 Javascript
RxJS的入门指引和初步应用
Jun 15 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
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
js中的eventType事件及其浏览器支持性介绍
2013/11/29 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
深入研究React中setState源码
2017/11/17 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
vue实现的树形结构加多选框示例
2019/02/02 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
Sanic框架流式传输操作示例
2018/07/18 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
PyQt5实现暗黑风格的计时器
2019/07/29 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
python中@contextmanager实例用法
2021/02/07 Python
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
个人投资计划书
2014/05/01 职场文书
检讨书格式
2015/01/23 职场文书
考生诚信考试承诺书
2015/04/29 职场文书