`

前端中经常出现的算法总结

阅读更多

虽说我们很多时候前端很少有机会接触到算法,但对算法的理解和掌握是一个优秀工程师的评价标准之一,而且当我们面对较为复杂的问题,这些基础知识的积累可以帮助我们更好的优化解决思路。在一段时间的学习之后,我总结罗列了前端中常见见的几个算法:

一:排序算法

排序算法是比较开发的算法之一,方法种类较多,在此列举两种简单的排序算法:冒泡排序和快速排序。冒泡排序其实就是通过比较相邻位置的元素大小,如果左边比右边大,就交换位置,继续比较,实际上就是每轮比较都得出一个最大值(或者最小值)。然后通过n-1轮比较,就能得出一个排好序的序列(通过设置一个flag,当数组基本有序的时候其实不一定需要比较到n-1轮)。

function bubbleSort(arr){
     for(var i=1;i<arr.length;i++){
         for(var j=0;j<arr.length-i;j++){
             var temp;
             if(arr[j]>arr[j+1]){
                 temp=arr[j];
                 arr[j]=arr[j+1];
                 arr[j+1]=temp;
             }
         }
     }
     return arr;
}

快速排序简单来讲就是我们选定一个数,然后比它小的都放在它左边,大于等于它的都放在它右边,那么这个时候对这个数来讲他的位置已经排到了正确的地方了,接下来要做的就是在它的左右两边分别再进行类似操作。

function quickSort(arr,l,r){
    var i,j,x;
    if(l<r){
        i=l;
        j=r;
        x=arr;
        while(i<j){
            while(i<j&&arr[j]>=x){
                j--;
            }
            if(i<j){
                arr=arr[j];
            }
            while(i<j&&arr<x){
                i++;
            }
            if(i<j){
                arr[j]=arr;
            }
        }
        arr=x;
        //递归调用
        quickSort(arr,i+1,r);
        quickSort(arr,l,i-1);
    }
    return arr;
}


二:阶乘算法

function factorialize(num) {
    var result = num;
    if (num < 0) {
        return -1;
    } else if (num === 0 || num === 1) {
        return 1;
    } else {
        while (num > 1) {
            num--;
            result *= num;
        }
    }
    return result;
}


三:回文字符串判断

如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。

function palindrome(str) {
    // 删除字符串中不必要的字符
    var re = /[W_]/g;
    // 将字符串变成小写字符
    var lowRegStr = str.toLowerCase().replace(re, '');
    // 如果字符串lowRegStr的length长度为0时,字符串即是palindrome
    if (lowRegStr.length === 0) {
        return true;
    }
    // 如果字符串的第一个和最后一个字符不相同,那么字符串就不是palindrome
    if (lowRegStr[0] !== lowRegStr[lowRegStr.length - 1]) {
        return false;
    } else {
        return palindrome(lowRegStr.slice(1, lowRegStr.length - 1));
    }
}


四:翻转字符串算法

function reverseString(str) {
    var tmp = "";
    for (var i = str.length - 1; i >= 0; i--) {
        tmp += str.charAt(i);
    }
    return tmp;
}
第二种翻转字符串算法:

function reverseString(s) {
    var arr = s.split('');
    var i = 0, j = arr.length - 1;
    while (i < j) {
        var t = arr;
        arr = arr[j];
        arr[j] = t;
        i++;
        j--;
    }
    return arr.join('');
}


五:整型数组去重算法

主要考察程序员对Object的使用,利用key来进行筛选。

function unique(arr)
     var hashTable = {};
     var data = [];
     for(var i = 0, l = arr.length; i < l; i++) {
         if(!hashTable[arr]) {
             hashTable[arr] = true;
             data.push(arr);
         }
     }
     return data;
}

六:数组中最大差值

function getMaxProfit(arr) {
    var minPrice = arr[0];
    var maxProfit = 0;
    for (var i = 0; i < arr.length; i++) {
        var currentPrice = arr;
        minPrice = Math.min(minPrice, currentPrice);
        var potentialProfit = currentPrice - minPrice;
        maxProfit = Math.max(maxProfit, potentialProfit);
    }
    return maxProfit;
}

七:随机指定长度字符串

function randomString(n) {
    var str = 'abcdefghijklmnopqrstuvwxyz9876543210';
    var tmp = '';
    var l = str.length;
    for(var i = 0; i < n; i++) {
        tmp += str.charAt(Math.floor(Math.random() * l));
    }
    return tmp;
}

八:统计字符串中次数最多字母

function findMaxDuplicateChar(str) {
    if(str.length == 1) {
        return str;
    }
    var charObj = {};
    for(var i = 0; i < str.length; i++) {                      
        if(!charObj[str.charAt(i)]) {
            charObj[str.charAt(i)] = 1;
        } else {
            charObj[str.charAt(i)] += 1;
        }
    }
    var maxChar = '',
        maxValue = 1;
    for(var k in charObj) {
        if(charObj[k] >= maxValue) {
            maxChar = k;
            maxValue = charObj[k];
        }
    }
    return maxChar;
}

九:生成菲波那切数列数组

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列主要考察递归的调用。通过定义fibo = fibo[i-1]+fibo[i-2];来生成斐波那契数组。

function getFibonacci(n) {
    var fibarr = [];
    var i = 0;
    while(i < n) {
        if(i <= 1) {
            fibarr.push(i);
        } else {
            fibarr.push(fibarr[i - 1] + fibarr[i - 2])
        }
        i++;
    }
    return fibarr;
}
以上几个前端中经常会出现的小算法是学习中的练习和总结,整理此文如果有错误希望小伙伴们积极指正,有更好更简洁的算法知识也希望不吝分享,以求共同进步。
分享到:
评论

相关推荐

    前端JS面试中常见的算法问题总结

    虽然说在前端很少有机会接触到算法,大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一...下面这篇文章就给大家总结了在前端JS面试中常见的算法问题,有需要的朋友们可以参考借鉴,下面来一起看看吧。

    前端 RSA分段加密算法

    总结来说,"前端 RSA 分段加密算法"是一种确保前端数据安全的策略,它利用RSA非对称加密的特性,结合分段加密的方法,处理大长度的数据,使得在前端环境中也能实现高效且安全的数据加密。"jsencrypt.min.js"库为...

    前端面试大全、前端常见问题和原理总结、前端面试题、前端面试经验、前端知识持续更新中,包括:JavaScript、Vue、Webp

    前端面试大全、前端常见问题和原理总结、前端面试题、前端面试经验、前端知识持续更新中,包括:JavaScript、Vue、Webpack、TypeScript、html、css、前端架构、前端算法、前端工程搭建、前端职场、React、技术选型、...

    前端面试大全、前端常见问题和原理总结、前端面试题、前端面试经验

    前端面试 前端面试大全、前端常见问题和原理总结、前端面试题、前端面试经验JavaScript、Vue、Webpack、TypeScript、html、css、前端架构、前端算法、前端工程搭建、前端职场、React、技术选型、移动端适配、h5、...

    基于RBF神经网络的WSN前端网络节点选取算法.pdf

    总结来说,该研究结合RBF神经网络和WSN的分簇路由策略,设计了一种能有效选择前端网络节点的算法,旨在降低能量消耗,减少信息冗余,提高网络效率和生存时间。这种方法对于优化WSN的能源管理,特别是在资源有限的...

    大前端中的二分算法.docx

    总结来说,二分查找是一种在有序数据结构中快速查找的算法,它利用了数据的有序性,通过不断地缩小查找区间来提高查找效率。在前端开发中,掌握这种算法能够帮助我们编写出更加高效、优化的代码,应对大数据量的场景...

    前端总结、手写代码、数据结构与算法 Leetcode、源码解析.zip

    在给定的压缩包文件"前端总结、手写代码、数据结构与算法 Leetcode、源码解析.zip"中,我们可以挖掘出多个关键的学习资源和知识点,涵盖了前端开发、编程实践以及算法基础等多个方面。以下是对这些主题的详细阐述: ...

    web前端-基于LCSS算法的新型非均匀采样滤波系统.pdf

    在第五章总结与展望中,作者总结了本文的研究成果,并展望了未来的研究方向。 本文的主要贡献在于: 1. 提出了LCSS改进方案和改进型LCSS采样滤波算法,提高了非均匀采样滤波算法的精度和效率。 2. 设计了一种动态...

    vue+react+算法前端面试.7z

    在IT行业中,前端开发是至关重要的领域,涵盖了各种技术栈,包括Vue.js、React以及算法。这些技术在构建现代Web应用程序中发挥着核心作用。本文将深入探讨Vue、React和算法这三个关键知识点,并结合给定的压缩包文件...

    国密算法SM2公私钥加解密及签名验签以及前端js sm-crypto

    总结,国密算法SM2是一种强大的安全工具,结合前端js库sm-crypto,可以在Web应用中实现安全的数据加解密和身份认证。理解并熟练运用这些技术,对于提升我国信息化系统的安全性具有重要意义。在实际开发中,开发者...

    第2章 前端1 :数据结构和算法上

    总结来说,数据结构和算法是前端开发的基础,也是衡量开发者技术深度的重要标准。熟练掌握并能灵活应用,不仅能在面试中脱颖而出,更能提升日常开发的效率和质量。对于前端工程师而言,不断学习和深入理解这些知识,...

    Matlab各种常见算法代码总结

    这篇“Matlab各种常见算法代码总结”涵盖了多个领域的经典算法,旨在帮助开发者更好地理解和应用这些算法。下面将对提及的一些关键算法进行详细介绍。 1. **Floyd最短路算法**:Floyd-Warshall算法是一种用于解决...

    《国密算法》--SM2 国密前端算法代码.zip

    个人实战积累的成果,基于国密算法的总结,希望可以帮到您 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~ 个人实战积累的成果,基于国密算法的总结,希望可以帮到您 亲们下载我任何一个...

    基于遗传算法的光学天线优化_matlab遗传算法_算法天线阵列_comsol遗传算法_comsol_comsolmatlab_源

    通过MATLAB的LiveLink for COMSOL功能,可以在MATLAB环境中调用COMSOL模型,实时获取仿真结果并反馈到遗传算法中,从而进行迭代优化。 "comsol遗传算法"是指在COMSOL中直接应用遗传算法进行优化的一种方式。虽然...

    前端算法基础与实战.docx

    ### 前端算法基础与实战 #### 一、引言 随着前端技术的发展,算法在前端开发中的重要性日益凸显。扎实的算法基础不仅能够帮助开发者写出更高质量的代码,还能在求职过程中脱颖而出。本文将针对前端开发中最常见的...

    新近SLAM算法总结1

    近年来,SLAM算法不断发展,出现了许多创新方法。以下是对一些新近SLAM算法的概述,重点关注ORB-SLAM2这一重要的里程碑式算法。 ORB-SLAM2是2015年提出的一种单目SLAM解决方案,随后在2016年进行了更新,增加了双目...

    字节面试算法题总结大全

    【字节面试算法题总结大全】的描述中提到,算法题在面试中扮演着重要的角色,尤其是对于希望进入大型科技公司的求职者来说,无论是前端还是其他语言的开发者,都需要具备一定的算法基础。算法题虽然在实际开发中可能...

    利用“剪叶子”算法实现树形结构的搜索功能,用Vue.js实现

    总结起来,通过“剪叶子”算法,我们可以有效地搜索树形结构,结合Vue.js的组件化和响应式特性,可以构建出高效、交互友好的前端搜索功能。这不仅能够帮助用户快速定位所需信息,也有助于提升项目的整体质量与用户...

Global site tag (gtag.js) - Google Analytics