算法是程序的灵魂,一个优秀的前端工程师对算法也是要有所了解的。

  1. 排序算法

1. 冒泡排序

  1. //冒泡排序
  2. function bubbleSort(arr){
  3. var i = j = 0;
  4. for(i=1;i<arr.length;i++){
  5. for(j=0;j<=arr.length-i;j++){
  6. var temp = 0;
  7. if(arr[j]>arr[j+1]){
  8. temp = arr[j];
  9. arr[j] = arr[j+1];
  10. arr[j+1] = temp;
  11. }
  12. }
  13. }
  14. }

2. 快速排序

  1. //快速排序
  2. function quickSort(arr,l,r){
  3. if(l < r){
  4. var i = l, j = r, x = arr[i];
  5. while(i<j){
  6. while(i<j && arr[j]>x)
  7. j--;
  8.  
  9. if(i<j)
  10. //这里用i++,被换过来的必然比x小,赋值后直接让i自加,不用再比较,可以提高效率
  11. arr[i++] = arr[j];
  12.  
  13. while(i<j && arr[i]<x)
  14. i++;
  15.  
  16. if(i<j)
  17. //这里用j--,被换过来的必然比x大,赋值后直接让j自减,不用再比较,可以提高效率
  18. arr[j--] = arr[i];
  19. }
  20. arr[i] = x;
  21.  
  22. quickSort(arr, l, i-1);
  23. quickSort(arr, i+1, r);
  24. }
  25. }

3. 二路归并

  将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序

  1. function merge(left, right) {
  2. var result = [],
  3. il = 0,
  4. ir = 0;
  5.  
  6. while (il < left.length && ir < right.length) {
  7. if (left[il] < right[ir]) {
  8. result.push(left[il++]);
  9. } else {
  10. result.push(right[ir++]);
  11. }
  12. }
  13. while(left[il]){
  14. result.push(left[il++]);
  15. }
  16. while(right[ir]){
  17. result.push(right[ir++]);
  18. }
  19. return result;
  20. }

字符串操作

1. 判断回文字符串

  1. function palindrome(str){
  2. // \W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
  3. var re = /[\W_]/g;
  4. // 将字符串变成小写字符,并干掉除字母数字外的字符
  5. var lowRegStr = str.toLowerCase().replace(re,'');
  6. // 如果字符串lowRegStr的length长度为0时,字符串即是palindrome
  7. if(lowRegStr.length===0)
  8. return true;
  9. // 如果字符串的第一个和最后一个字符不相同,那么字符串就不是palindrome
  10. if(lowRegStr[0]!=lowRegStr[lowRegStr.length-1])
  11. return false;
  12. //递归
  13. return palindrome(lowRegStr.slice(1,lowRegStr.length-1));
  14. }

2. 翻转字符串

  思路1:反向遍历字符串

  1. function reverseString(str){
  2. var tmp = '';
  3. for(var i=str.length-1;i>=0;i--)
  4. tmp += str[i];
  5. return tmp
  6. }

  思路2:转化成array操作

  1. function reverseString2(str){
  2. var arr = str.split("");
  3. var i = 0,j = arr.length-1;
  4. while(i<j){
  5. tmp = arr[i];
  6. arr[i] = arr[j];
  7. arr[j] = tmp;
  8. i++;
  9. j--;
  10. }
  11. return arr.join("");
  12. }

3. 生成指定长度的随机字符串

  配合模糊等效果可以生成验证码

  1. function randomString(n){
  2. var str = 'abcdefghijklmnopqrstuvwxyz0123456789';
  3. var tmp = '';
  4. for(var i=0;i<n;i++)
  5. tmp += str.charAt(Math.round(Math.random()*str.length));
  6. return tmp;
  7. }

4. 统计字符串中次数最多的字母

  利用Object中key的唯一性,利用key来进行筛选,然后计数

  1. function findMaxDuplicateChar(str) {
  2. if(str.length == 1) {
  3. return str;
  4. }
  5. var charObj = {};
  6. for(var i = 0; i < str.length; i++) {
  7. if(!charObj[str.charAt(i)]) {
  8. charObj[str.charAt(i)] = 1;
  9. } else {
  10. charObj[str.charAt(i)] += 1;
  11. }
  12. }
  13. var maxChar = '',
  14. maxValue = 1;
  15. for(var k in charObj) {
  16. if(charObj[k] >= maxValue) {
  17. maxChar = k;
  18. maxValue = charObj[k];
  19. }
  20. }
  21. return maxChar + ':' + maxValue;
  22. }

数组操作

1. 数组去重

  利用Object中的key的唯一性,利用key来进行筛选

  1. function unique(arr){
  2. var obj = {}
  3. var data = []
  4. for(var i in arr){
  5. if(!obj[arr[i]]){
  6. obj[arr[i]] = true;
  7. data.push(arr[i]);
  8. }
  9. }
  10. return data;
  11. }

2. Number数组中最大差值

  1. function getMaxProfit(arr){
  2. var min = arr[0], max = arr[0];
  3. for(var i=0;i<arr.length;i++){
  4. if(arr[i]<min)
  5. min = arr[i];
  6. if(arr[i]>max)
  7. max = arr[i];
  8. }
  9. return max - min;
  10. }

其他常见算法

1. 阶乘

  1. //1. 非递归实现
  2. function factorialize(num) {
  3. var result = 1;
  4. if(num < 0) return -1;
  5. if(num == 0 || num == 1) return 1;
  6. while(num>1)
  7. result *= num--;
  8. return result;
  9. }
  10. //2. 递归实现
  11. function factorialize(num) {
  12. var result = 1;
  13. if(num < 0) return -1;
  14. if(num == 0 || num == 1) return 1;
  15. if(num > 1){
  16. return num*factorialize(num-1);
  17. }
  18. }

2. 生成斐波那契数列

  斐波拉契:又称黄金分割数列,值得是一个数列:0、1、2、3、5、8、13、21、34....,在数学上,斐波拉契数列主要考察递归的调用。

2.1 强行递归实现

  1. function getfib(n){
  2. if(n == 0)
  3. return 0;
  4. if(n == 1)
  5. return 1;
  6. if(n > 1){
  7. return getfib(n-1) + getfib(n-2);
  8. }
  9. }
  10. function fibo(len){
  11. var fibo = [];
  12. for(var i=0;i<len;i++)
  13. fibo.push(getfib(i));
  14. return fibo;
  15. }

2.2 简约非递归实现

  1. function getFibonacci(n) {
  2. var fibarr = [];
  3. var i = 0;
  4. while(i < n) {
  5. if(i <= 1) {
  6. fibarr.push(i);
  7. } else {
  8. fibarr.push(fibarr[i - 1] + fibarr[i - 2])
  9. }
  10. i++;
  11. }
  12. return fibarr;
  13. }

3. 二分查找

  二分查找:是在有序数组中用的比较频繁的一种算法,优点是比较次数少,查找速度快、平均性能好;缺点是要求待查表为有序,且插入删除困难

3.1 非递归实现

  1. function binary_search(arr, key) {
  2. var low = 0,
  3. high = arr.length - 1;
  4. while(low <= high){
  5. var mid = parseInt((high + low) / 2);
  6. if(key == arr[mid]){
  7. return mid;
  8. }else if(key > arr[mid]){
  9. low = mid + 1;
  10. }else if(key < arr[mid]){
  11. high = mid -1;
  12. }
  13. }
  14. return -1;
  15. };

3.2 递归实现

  1. function binary_search2(arr, low, high, key) {
  2. if(low > high)
  3. return -1;
  4. var mid = parseInt((low + high)/2);
  5. if(key == arr[mid])
  6. return mid;
  7. else if(key > arr[mid])
  8. return binary_search2(arr, mid+1, high, key);
  9. else if(key < arr[mid])
  10. return binary_search2(arr, low, mid-1, key);
  11. }

  

前端常见算法JS实现的更多相关文章

  1. 前端常见算法的JS实现

    1.冒泡排序 function bubbleSort(arr){ var i = 0, j = 0; for(i=1; i<arr.length; i++){ for(j=0; j<=ar ...

  2. 几种常见算法js

    没有系统地总结过js算法,虽然在项目中陆陆续续的也用过好多算法,有一次去一家公司面试的时候,面试官说想谈谈算法,有点懵了,所以接下来的面试中谈的也有点被动,避免下次再碰到这种情况,今天决定好好的总结下 ...

  3. 常见算法是js实现汇总(转载)

    常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...

  4. JS中常见算法问题

    JS中常见算法问题 1. 阐述JS中的变量提升(声明提前) 答:将所有的变量提升当当前作用域的顶部,赋值留在原地.意味着我们可以在某个变量声明前就使用该变量. 虽然JS会进行变量提升,但并不会执行真正 ...

  5. 0基础菜鸟学前端之Vue.js

    简介:0基础前端菜鸟,啃了将近半月前端VUE框架,对前端知识有了初步的了解.下面总结一下这段时间的学习心得. 文章结构 前端基础 Vue.js简介 Vue.js常用指令 Vue.js组件 Vue.js ...

  6. 前端怎么用js模拟应用 JSON-通俗易懂

    前端怎么用js模拟应用 JSON-通俗易懂,这是转载额 好多孩子 弄不明确复杂的json 格式的应用,以下从基础来看一看JSON.怎么玩, 事实上结构理解清了,写起来比html还爽吧. 0.前言   ...

  7. 2019前端面试系列——JS面试题

    判断 js 类型的方式 1. typeof 可以判断出'string','number','boolean','undefined','symbol' 但判断 typeof(null) 时值为 'ob ...

  8. 前端与算法 leetcode 7. 整数反转

    目录 # 前端与算法 leetcode 7. 整数反转 题目描述 概要 提示 解析 解法 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 leetcode 7. 整数反转 题 ...

  9. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

随机推荐

  1. System.Text.Encoding.Default

    string strTmp = "abcdefg某某某";int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;/ ...

  2. zabbix自定义监控mysql

    创建用户: use mysql; grant all privileges on *.* to 'zabbix'@'%' identified by 'zabbixpasswd'; grant all ...

  3. wepy小程序实现列表分页上拉加载(1)

    使用wepy开发微信小程序商城第一篇:项目初始化 使用wepy开发微信小程序商城第二篇:路由配置和页面结构 列表页效果图: 1.新建列表页 (1)在pages里面新建一个list.wpy文件 初始代码 ...

  4. 10.12 android输入系统_InputStage理论

    android应用程序对输入系统的处理分为多个阶段,我们把这些阶段称为InputStage 理论处理流程: (1)activity发给window,如果window不能处理,再由activity处理; ...

  5. 转 OC温故:类的三大特性(封装,继承,多态)

    原文标题:OC学习篇之---类的三大特性(封装,继承,多态) 我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性 ...

  6. dp hdu5653 xiaoxin and his watermelon candy

    传送门:点击打开链接 题意:有n个箱子排成一排,有m个炸弹.位置告诉你.如今炸弹的左边伤害和右边伤害能够自己控制,要求 每一个炸弹炸的箱子数的累乘,输出答案取log2并乘以1e6 思路:直接2for ...

  7. angular项目中各个文件的作用

    原文地址 https://www.jianshu.com/p/176ea79a7101 大纲 1.对angular项目中的一些文件的概述 2.对其中一些文件的详细描述 2.1.package.json ...

  8. EntityFrameworkCore 中的 Attach 方法

    Attach 的坑 Model Filed Database Value Console Value User Phone +123000000000 +12333333333 User Email ...

  9. 【33.10%】【codeforces 604C】Alternative Thinking

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  10. [HTML] Creating visual skip links in HTML and CSS

    Skip links are an extremely helpful navigation pattern for keyboard and screen reader users, since t ...