算法之常用公共方法

1. 排序算法(共10个)

1.1 正排序 反排序
1.2 冒泡
let nums = [1,8,9,73,4,5]
for(let i = 0; i <nums.length ; i++){
    for(let j = i + 1; j < nums.length ; j++){
        if(nums[i] > nums[j]){
            let tmp = nums[j];
            nums[j] = nums[i]
            nums[i] = tmp
        }
    }
}
1.3 快排
1.4 选择排序(稳定排序)
let nums = [1,2,3,3,4,5,13]
for(let i = 0; i < nums.length; i++){
	minIndex = i;
	for(let j = i  +1; j < nums.length; j++){
		if(arr[i]<arr[minIndex]){  // 寻找最小的数
		 	minInex = j; // 将最小数的索引保存
		}
	}
	if(minIndex !== i){
			tmp = arr[i];
	arr[i] = arr[minIndex];
	arr[minIndex] = tmp;
	}
}
return arr;
1.4 插入排序

2. 字符串

2.1 查找字符串子串

2.2 判断是不是子串
2.3 最长公共前缀
//输入:strs = ["flower","flow","flight"]
// 输出:"fl"
var longestCommonPrefix = function(strs) {
    if(strs.length == 0){return ""}
      strs.sort((a,b) => {return a.length-b.length})
    let tmpStr = strs[0];
    for(let i = 1; i < strs.length ; i++){
        let j = 0
       while(j < tmpStr.length){                
           if(tmpStr[j] !== strs[i][j]){
               // console.log(tmpStr[j],strs[i][j],i)
              tmpStr = tmpStr.substr(0,j)
              break
           }
           j++
       }
     //  console.log(tmpStr)
       if(tmpStr.length == 0 && i < strs.length - 2){
           return ""
       }
    }
    return tmpStr
};

2.3 判断最长的回文子串

if(s.length < 2){return s}
   let start = 0, end =0;
   let n = s.length;
//    中心扩散法
let centerExpend = (left, right) => {
    while(left>=0 && right <= n && s[left] === s[right]){
        left--;
        right++;
    }
    return right - left -1
   
}
 for(let i = 0; i < n ; i++){
        let len1 = centerExpend(i,i)
        let len2 = centerExpend(i, i+1)
        let maxLen = Math.max(len1,len2)
        if(maxLen > end - start){
            start = i - ((maxLen -1) >> 1)
            end = i +(maxLen >> 1)
        }
    }
return s.substring(start,end+1)
2.4 字符串颠倒
2.5 字符串计算
2.6 验证回文串
var isPalindrome = function(s) {
      s = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase();
      console.log(s)
  let [left, right] = [0, s.length - 1];
  while (left < right) {
    if(s[left++] !== s[right--]) return false;
  }
  return true;
};
2.6 判断是不是回文子串
2.7 查找字符串中的所有子串

function getAllSubstring(str){
    if(str.length === 0){
        return "字符串为空";
    }
    let result = []; //保存结果
    for(let i = 1; i <= str.length; i++){  //定义子串的长度为i,从1到最长
        for(let j = 0; i + j <= str.length; j++){ //i + j <= str.length;注意这个条件,一定要有“=”
            result.push(str.substring(j, i + j));  //截取字符串,从j开始,到i+j(不包含),长度为i
        }
        //for(let j = 0; i + j < str.length; j++){ //这里没有等于
         //   result.push(str.substring(j, i + j + 1));  //截取字符串,从j开始,到i+j(不包含),长度为i + 1,不符合题意
        //}
    }
    return result.join(",");
}
let re = getAllSubstring("adc");//a,d,c,ad,dc,adc

3.子序列问题

3.1 最长递增子序列
 let result = 1
    let dp = new Array(nums.length + 1).fill(1)
    for(let i = 1; i < nums.length ; i++){
        for(let j = 0; j < i; j++){
             if(nums[i] > nums[j]) dp[i] = Math.max(dp[i], dp[j] +1)
        }
        result = Math.max(result, dp[i]);
    }
    return result
3.2 最长公共子序列
3.3 判断子序列
3.4 最长回文子序列

4. 链表

4.1 反转链表
 let p1 = head;
     let p2 = null;
     while(p1){
         const tmp = p1.next
         p1.next = p2;
         p2 = p1;
         p1 = tmp;        
     }
     return p2

4.动归系列

4.1 打家劫舍

5.深浅拷贝

function deepClone(obj = {}){
    if(typeof obj != 'object' || obj == null){
        return obj
    }
    let res 
    if(obj instanceof Array){
        res = []
    }else{
        res = {}
    }
    for(let key in obj){
        if(obj.hasOwnProperty(key)){
            res[key] = deepClone(obj[key])
        }
    }
    return res
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值