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数组处理多个字符串的连接问题
Aug 20 Javascript
EASYUI TREEGRID异步加载数据实现方法
Aug 22 Javascript
jQuery文本框(input textare)事件绑定方法教程
Apr 24 Javascript
JavaScript自定义日期格式化函数详细解析
Jan 14 Javascript
js实现滑动触屏事件监听的方法
May 05 Javascript
JS实现简单路由器功能的方法
May 27 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
Nov 17 Javascript
JS设置时间无效问题的解决办法
Feb 18 Javascript
jQuery实现下拉菜单的实例代码
Jun 19 jQuery
深入理解Vuex 模块化(module)
Sep 26 Javascript
如何在Vue.js中实现标签页组件详解
Jan 02 Javascript
Vue模板语法中数据绑定的实例代码
May 17 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如何得到当前页和上一页的地址?
2006/11/27 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
php blowfish加密解密算法
2016/07/02 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
javascript Array.remove() 数组删除
2009/08/06 Javascript
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
javascript实现图片自动和可控的轮播切换特效
2015/04/13 Javascript
初识NodeJS服务端开发入门(Express+MySQL)
2017/04/07 NodeJs
Angularjs自定义指令Directive详解
2017/05/27 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
2018/04/17 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
js通过canvas生成图片缩略图
2020/10/02 Javascript
[01:24:34]2014 DOTA2华西杯精英邀请赛5 24 DK VS LGD
2014/05/25 DOTA
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
python递归查询菜单并转换成json实例
2017/03/27 Python
详解python之heapq模块及排序操作
2019/04/04 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
汉森批发:Hansen Wholesale
2018/05/24 全球购物
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
俄罗斯购买剧院和演唱会门票网站:Parter.ru
2019/11/09 全球购物
法律工作求职自荐信
2013/10/31 职场文书
护士节慰问信
2015/02/15 职场文书
音乐之声观后感
2015/06/04 职场文书
用Python selenium实现淘宝抢单机器人
2021/06/18 Python
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS