美文网首页
js常用算法

js常用算法

作者: emoipower | 来源:发表于2017-03-29 02:01 被阅读0次

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

    一:排序算法

    排序算法是比较开发的算法之一,方法种类较多,在此列举两种简单的排序算法:冒泡排序和快速排序。冒泡排序其实就是通过比较相邻位置的元素大小,如果左边比右边大,就交换位置,继续比较,实际上就是每轮比较都得出一个最大值(或者最小值)。然后通过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[i];
            while(i<j){
                while(i<j&&arr[j]>=x){
                    j--;
                }
                if(i<j){
                    arr[i]=arr[j];
                }
                while(i<j&&arr[i]<x){
                    i++;
                }
                if(i<j){
                    arr[j]=arr[i];
                }
            }
            arr[i]=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[i];
            arr[i] = 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[i]]) {
                 hashTable[arr[i]] = true;
                 data.push(arr[i]);
             }
         }
         return data;
    }
    

    六:数组中最大差值

    function getMaxProfit(arr) {
        var minPrice = arr[0];
        var maxProfit = 0;
        for (var i = 0; i < arr.length; i++) {
            var currentPrice = arr[i];
            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[i] = 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常用算法

          本文链接:https://www.haomeiwen.com/subject/zzasottx.html