JS基础算法

反转字符串

function reverseStr(str) {
	return str === "" ? "" : (reverseStr(str.substring(1)) + str.charAt(0))
}
reverseStr("hello")

计算整数的阶乘

5! = 1*2*3*4*5 = 120

function jieCheng(num){
    return num <= 1 ? 1 : num * jieCheng(num-1)
}
jieCheng(5)

获取数组中的最大值

Math.max.apply(null,[1,3,4,56])

实现endsWith()

function confirmEnd(str,target) {
    return 	str.substring(str.length - target.length) === target;
}
confirmEnd("hello","lle")

二分查找

function binarySearch(arr,left,right,findVal) {
	if (left > right) {
		return -1;
	}
	let mid = Math.floor((left + right) / 2);
	let midVal = arr[mid];
	if(findVal > midVal) {
		// 向右递归
		return binarySearch(arr,mid+1,right,findVal);
	}else if (findVal < midVal) {
		// 向左递归
		return binarySearch(arr,left,mid-1,findVal);
	}else {
		return mid;
	}
}

数组扁平化去重

let arr = [[1,3,2,3],[2,4,9,2,1]];
[...new Set(arr.flat().sort((a,b)=>a-b))]

打印1-1000之间的对称数

[...Array(10000).keys()].filter((x) => { 
  return x.toString().length > 1 && x === Number(x.toString().split('').reverse().join('')) 
})

将所有 0 移动到数组的末尾

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  • 必须在原数组上操作,不能拷贝额外的数组。
  • 尽量减少操作次数
function zeroMove(array) {
   let len = array.length;
    let j = 0;
    for(let i=0;i<len-j;i++){
        if(array[i]===0){
            array.push(0);
            array.splice(i,1);
            i --;
            j ++;
        }
    }
    return array;
}

柯里化

function add(){
	let args = [...arguments];
	let addfun = function(){
		args.push(...arguments);
		return addfun;
	}
	addfun.toString = function(){
		return args.reduce((a,b)=>{
			return a + b;
		});
	}
	return addfun;
}

全排列

function fullArrange(str) {
    let result = [];
    if(str.length > 1) {
        for(let i=0;i<str.length;i++){
            let cur = str[i];
            let other = str.slice(0,i) + str.slice(i+1,str.length);
            let preResult = fullArrange(other);
            for(let item of preResult) {
                result.push(cur + item);
            }
        }
    }else if(str.length === 1){
        result.push(str);
    }
    return result;
}
fullArrange("abcd")

求两个字符串的最长公共子串

比如:str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最长公共子串长度为5。
解析: 将两个字符串转换为一个二维数组
在这里插入图片描述

function getMaxLength(str1,str2){
    let arr = new Array(str1.length);
    let max = 0;
    for(let i = 0;i < str1.length; i++) {
        let temp = [];
        for(let j = 0;j < str2.length; j++) {
            if(str1.charAt(i) === str2.charAt(j)) {
            	// 如果两个字符相等,则在上一个对角线的基础上加1
                if(i > 1 && j > 1) {
                    max = arr[i-1][j-1] + 1;
                    temp.push(max);
                }else {
                    temp.push(1);
                }
            }else {
                temp.push(0);
            }
        }
        arr[i] = temp;
    }
    return max;
}
getMaxLength("acbcbcef","abcbced")

斐波拉契数列

0,1,1,2,3,5,8,13,21,34,55,......

递归

function fibo (n) {
    if (n <= 0)  return 0;
    if (n === 1) return 1;
    return fibo(n - 1) + fibo(n - 2);
}

缺点:如果N足够大, 递归树就会非常庞大,响应会特别慢

动态规划

function fibo (n) {
    if (n <= 0) return 0;
    if (n <= 1) return 1;
    var res, a = 0, b = 1;
    for (var i = 2; i <= n; i++) {
        res = a + b;
        a = b;
        b = res;
    }
    return res;
}

无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
var lengthOfLongestSubstring = function(s) {
    let obj = []; // 用于存储子串
    let max = 0;
    for(let i=0;i<s.length;i++) {
        let index = obj.indexOf(s[i]);
        if(index < 0) {
        	// 当前字符不在obj里面则继续添加
            obj.push(s[i];
            max = Math.max(max, obj.length);
        }else {
        	// 在,取当前子串的长度与Max比对
            max = Math.max(max, obj.length); 
            obj.splice(0,index+1);
            obj.push(s[i])
        }
    }
    return max;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值