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 金额文本框实现代码
Feb 14 Javascript
调用innerHTML之后onclick失效问题的解决方法
Jan 28 Javascript
[原创]推荐10款最热门jQuery UI框架
Aug 19 Javascript
jQuery中ajax的load()方法用法实例
Dec 26 Javascript
js同源策略详解
May 21 Javascript
JS脚本实现动态给标签控件添加事件的方法
Jun 02 Javascript
Yarn的安装与使用详细介绍
Oct 25 Javascript
js实现仿购物车加减效果
Mar 01 Javascript
vue.js从安装到搭建过程详解
Mar 17 Javascript
JavaScript中最常用的10种代码简写技巧总结
Jun 28 Javascript
elementUI select组件默认选中效果实现的方法
Mar 25 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
Jul 24 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入门之常量简介和系统常量
2014/05/12 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
使用Yii2实现主从数据库设置
2016/11/20 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
2020/10/28 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
jquery修改网页背景颜色通过css方法实现
2014/06/06 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
Vue DevTools调试工具的使用
2017/12/05 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
前端路由&amp;webpack基础配置详解
2019/06/10 Javascript
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
布同 统计英文单词的个数的python代码
2011/03/13 Python
python使用reportlab画图示例(含中文汉字)
2013/12/03 Python
python基础教程之循环介绍
2014/08/29 Python
python多进程并发demo实例解析
2019/12/13 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
三星印度官网:Samsung印度
2019/08/03 全球购物
五月的鲜花活动方案
2014/08/21 职场文书
2014年英语工作总结
2014/12/20 职场文书
职代会闭幕词
2015/01/28 职场文书
2016年春节慰问信息
2015/03/25 职场文书