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 相关文章推荐
Javascript 布尔型分析
Dec 22 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
Oct 13 Javascript
jquery ready函数源代码研究
Dec 06 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
Sep 02 Javascript
Javascript实现div的toggle效果实例分析
Jun 09 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
Jun 24 Javascript
避免jQuery名字冲突 noConflict()方法
Jul 30 Javascript
jquery实现自定义图片裁剪功能【推荐】
Mar 08 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
Jul 11 Javascript
Vue动态获取width的方法
Aug 22 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
Sep 21 Javascript
详解为什么Vue中不要用index作为key(diff算法)
Apr 04 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实现等比压缩图片大小
2016/03/04 PHP
php curl批处理实现可控并发异步操作示例
2018/05/09 PHP
PHP利用Mysql锁解决高并发的方法
2018/09/04 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
python合并文本文件示例
2014/02/07 Python
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
Django中URL的参数传递的实现
2019/08/04 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
2019/08/13 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
数字天堂软件测试面试题
2012/12/23 面试题
经销商订货会主持词
2014/03/27 职场文书
小学语文课后反思精选
2014/04/25 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
分享几个实用的CSS代码块
2022/06/10 HTML / CSS