时间复杂度
概念:程序执行时需要的计算量
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;
}