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 相关文章推荐
Apply an AutoFormat to an Excel Spreadsheet
Jun 12 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
Apr 16 Javascript
js操作checkbox遇到的问题解决
Jun 29 Javascript
JavaScript实现复制功能各浏览器支持情况实测
Jul 18 Javascript
javascript生成json数据简单示例分享
Feb 14 Javascript
JS中的form.submit()不能提交表单的错误原因
Oct 08 Javascript
jQuery中scrollTop()方法用法实例
Jan 16 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
Apr 07 Javascript
jQuery实现的兼容性浮动层示例
Aug 02 Javascript
layer.close()关闭进度条和Iframe窗的方法
Aug 17 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
Nov 20 Javascript
Vue项目环境搭建详细总结
Sep 26 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
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
JavaScript 题型问答有答案参考
2010/02/17 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
php跨域调用json的例子
2013/11/13 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
python 生成器协程运算实例
2017/09/04 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
Python分布式进程中你会遇到的问题解析
2019/05/28 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
如何基于线程池提升request模块效率
2020/04/18 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
Python异常处理机制结构实例解析
2020/07/23 Python
详解python内置模块urllib
2020/09/09 Python
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
网吧收银员岗位职责
2013/12/14 职场文书
咖啡书吧创业计划书
2014/01/13 职场文书
高中班主任评语大全
2014/04/25 职场文书
ktv筹备计划书
2014/05/03 职场文书
酒店开业主持词
2015/07/02 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技