常见算法前端JS实现

字符串操作

  1. 判断回文字符串
     function palindrome(str){

        // \W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。

        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;

        //递归

        return palindrome(lowRegStr.slice(1,lowRegStr.length-1));

    }
  1. 翻转字符串

思路1:反向遍历字符串

function reverseString(str){

    var tmp = '';

    for(var i=str.length-1;i>=0;i--)

        tmp += str[i];

    return tmp

}

思路2:转化成array操作

function reverseString2(str){

    var arr = str.split("");

    var i = 0,j = arr.length-1;

    while(i
  1. 生成指定长度的随机字符串,配合模糊等效果可以生成验证码
function randomString(n){

    var str = 'abcdefghijklmnopqrstuvwxyz0123456789';

    var tmp = '';

    for(var i=0;i
  1. 统计字符串中次数最多的字母,利用Object中key的唯一性,利用key来进行筛选,然后计数
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 + ':' + maxValue;

}

数组操作

  1. 数组去重,利用Object中的key的唯一性,利用key来进行筛选
function unique(arr){

    var obj = {}

    var data = []

    for(var i in arr){

        if(!obj[arr[i]]){

            obj[arr[i]] = true;

            data.push(arr[i]);

        }

    }

    return data;

}
  1. Number数组中最大差值
function getMaxProfit(arr){

    var min = arr[0], max = arr[0];

    for(var i=0;imax)

            max = arr[i];

    }

    return max - min;

}

其他常见算法

  1. 阶乘
    1.1. 非递归实现
function factorialize(num) {

    var result = 1;

    if(num < 0) return -1;

    if(num == 0 || num == 1) return 1;

    while(num>1)

        result *= num--;

    return result;

}
  1. 递归实现
function factorialize(num) {

    var result = 1;

    if(num < 0) return -1;

    if(num == 0 || num == 1) return 1;

    if(num > 1){

        return num*factorialize(num-1);

    }

}

2. 生成斐波那契数列

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

2.1 强行递归实现

function getfib(n){

    if(n == 0)

        return 0;

    if(n == 1)

        return 1;

    if(n > 1){

        return getfib(n-1) + getfib(n-2);

    }

}

function fibo(len){

    var fibo = [];

    for(var i=0;i

2.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;

}
  1. 二分查找

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

3.1 非递归实现

function binary_search(arr, key) {

    var low = 0,

        high = arr.length - 1;

    while(low <= high){

        var mid = parseInt((high + low) / 2);

        if(key == arr[mid]){

            return  mid;

        }else if(key > arr[mid]){

            low = mid + 1;

        }else if(key < arr[mid]){

            high = mid -1;

        }

    }

    return -1;

}

3.2 递归实现

function binary_search2(arr, low, high, key) {

    if(low > high)

        return -1;

    var mid = parseInt((low + high)/2);

    if(key == arr[mid])

        return mid;

    else if(key > arr[mid])

        return binary_search2(arr, mid+1, high, key);

    else if(key < arr[mid])

        return binary_search2(arr, low, mid-1, key);

}

你可能感兴趣的:(常见算法前端JS实现)