算法复习总结

时间复杂度

概念:程序执行时需要的计算量

O(1)一次就够(数量级)

function(arr){
return arr[1]+arr[2]+arr[3];
}

O(n)和输入的数据量一样(数量级)

function myfunc(arr){
for(let i=0;i<arr.length;i++){
console.log(arr[i]);
}
}

O(n^2)数据量的平方(数量级)

function myfunc(arr){
  for(let i=0;i<arr.length;i++)
     for(let j=0;j<arr.length;j++){
        console.log(arr[j]);
  }
}

O(logn)数据量的对数(数量级)

function func1(arr){
//二分
}

O(n*logn)数据量*数据量的对数(数量级)

function func1(arr){
for(let i=0;i<arr.length;i++){
         //二分
}
}

空间复杂度

概念:程序执行时需要的内存空间

O(1)

function func1(arr){

const a=arr[1];
const b=arr[2];
const c=arr[3];


}

O(logn)(在空间复杂度中不常用)

O(n)

function func1(arr){
const arr2=[];
for(let i=0;i<arr.length;i++){
arr2[i]=arr[i];
  }
}

O(nlogn)(不常用)

O( n^2)(不常用)

总结:复杂度是一个数量级,用O(...)来表示,内部是一个函数表达式

多维数组变一维数组

function flatten(arr){
let res=[];
for(let i=0;i<arr.length;i++){
if(Array.isArray(arr[i]))
{  res.concat(flatten(arr[i]));}
else{
   res.push(arr[i]);
}
}
return res;
}

数组去重

//方法1:双层内循环去重
function remove(arr){
for(let i=0;i<arr.length-1;i++){
for(let j=i+1;j<arr.length;j++){
if(arr[i]===arr[j]){
arr.splice(j,1);
j--;
    }
  }
}
return arr;
}

//方法2:利用indexof来去重
function remove(arr){
let res=[];
for(let i=0;i<arr.length;i++){
if(res.indexof(arr[i])==-1){
res.push(arr[i]);
  }
}
return res;
}

数组中第k大的数字出现了几次

function findnum(arr,k){
let key,num;
arr.sort((a,b)=>b-a);
let norepeat=Array.from(new set(arr));
key=norepeat[k-1];
if(k===norepeat.length){
return arr.length-arr.indexof(key);
}
else{
return arr.indexof(norepeat[k])-arr.indexof(key);
}
}

双指针对两个有序数组合并排序

function func1(arr1,arr2){
let m,i,k=0;
let res=[];
while(i<arr1.length&&k<arr2.length){
if(arr1[i]<arr2[k]){
res[m]=arr1[i];
m++;
i++;}
else{
res[m]=arr2[k];
m++;
k++;}
}
while(i<arr1.length){
res[m]=arr1[i];
i++;
m++;}
while(k<arr2.length){
res[m]=arr2[k];
m++;
k++;
}
return res;
}

数组实现加1

function plusOne(arr){
let len=arr.length-1;
for(let i=len;i>=0;i--){
if(arr[i]<9){arr[i]++;return arr;}
else{arr[i]=0;}
}
arr.unshift(1);
return arr;
}

冒泡排序

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

选择排序

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

快速排序

function quickSort(arr){
let left=[];
let right=[];
let pivot=arr[0];
for(let i=1;i<arr.length;i++){
if(arr[i]<pivot){left.push(arr[i]);}
else{right.push(arr[i]);}
}
return quickSort(left).concat(pivot,quickSort(right));
}

JS模拟防抖

function fangdou(fn,delay){
let timer=null;
return function{
if(timer){clearTimeOut(timer);}
else{
let timer=setTimeOut(()=>{fn();let timer=null;},delay);}
  }
}

JS模拟节流

function jieliu(fn,delay){
let timer=null;
return function(){
if(timer){return;}
else{
let timer=setTimeOut(()=>{fn();let timer=null;},delay);}
 }
}

JS模拟new

function mynew(fn,...){
let obj={};
let con=[].shift.call(arguments);
obj.proto=con.prototype;
let result=con.apply(obj,arguments);
return result;
}

回文字符串的判断

//方法1 :倒转判断法
function reverse(str){
let str1=str.split('').reverse().join('');
return str1===str;
}

//方法2:逐个比较法
function reverse(str){
let flag=true;
let len=arr.length;
for(let i=0;i<parseInt(arr.length/2);i++){
if(str[i]!=str[len-1-i]){flag=false;return flag;}
}
return flag;
}

统计字符串当中出现次数最多的字母

function findMaxChar(str){
let obj={};
for(let i=0;i<str.length;i++){
if(!obj[str[i]]){obj[str[i]]=1;}
else{obj[str[i]]++;}
}
}
let maxChar='',let maxNum=0;
for(let key in obj){
if(obj[key]>maxNum){
maxNum=obj[key];
maxChar=key;}
}
return maxChar;
}

连字符转驼峰

function changeStr(str){
let array=str.split('');
for(let i=0;i<array.length;i++){
arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].subString(1);
}
return array.join('');
}

最长公共前缀

function maxStr(arr){
if(arr.length===0)return "";
if(arr.length===1)return arr[0];
let res,temp='';
for(let i=0;i<arr[0].length;i++){
res=res+arr[0][i];
for(let j=1;j<arr.length;j++){
  if(arr[j].indexof(res)!=0){ return temp;}
}
temp=res;
}
return res;
}

将12345678转换为RMB的形式

function RMB(str){
let arr=str.split('').reverse();
let res=[];
for(let i=0;i<str.length;i++){
res.push(arr[i]);
if(i+1%3==0){res.push(',');}
}
return res.reverse().join('');
}

全排列

function full(str){
let result=[];
if(str.length===1){return str;}
for(let i=0;i<str.length;i++){
let left=str[i];
let rest=str.slice(0,i)+str.slice(i,str.length);
let fullRest=full(rest);
for(let j=0;j<fullRest.length;j++){
let temp=left+fullRest[j];
result.push(temp);
}
}
return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值