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 相关文章推荐
50个比较实用jQuery代码段
Sep 18 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
Nov 14 Javascript
常用Extjs工具:Extjs.util.Format使用方法
Mar 22 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
Nov 22 Javascript
js实现登陆遮罩效果的方法
Jul 28 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
Sep 04 Javascript
以Python代码实例展示kNN算法的实际运用
Oct 26 Javascript
JavaScript面向对象程序设计教程
Mar 29 Javascript
Bootstrap Table快速完美搭建后台管理系统
Sep 20 Javascript
微信小程序模拟cookie的实现
Jun 20 Javascript
js form表单input框限制20个字符,10个汉字代码实例
Apr 12 Javascript
element-ui组件中input等的change事件中传递自定义参数
May 22 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
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
php批量删除操作代码分享
2017/02/26 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
2017/03/02 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
js DataSet数据源处理代码
2010/03/29 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
jQuery页面加载初始化常用的三种方法
2014/06/04 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
2014/07/17 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
举例讲解Linux系统下Python调用系统Shell的方法
2015/11/07 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
商场拾金不昧表扬信
2014/01/13 职场文书
教师考核材料
2014/05/21 职场文书
文艺晚会策划方案
2014/06/11 职场文书
信仰心得体会
2014/09/05 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
实习单位鉴定意见
2015/06/04 职场文书
学生病假条范文
2015/08/17 职场文书
《正比例》教学反思
2016/02/23 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript