第七章 算法

117 阅读1分钟

一.算法之数组去重

方法一

【简单思路实现】:依次拿出数组中的每一项和后边项比较,出现重复就删除(双for)

var ary[2,4,32,5,623,3,33]
function no_rep(ary){
for(var i=0;i<ary.length-1;i++){
	var aaa=ary[i]
  for(var j=i+1;j<ary.length;j++){
  var bbb=ary[j]
  if(aaa=bbb){
  ary.splice(j,1)
    j--;//解决splice造成的数组塌陷问题
  }
  }
}
  ruturn ary;
}
console.log(no_rep(ary))

方法二:

【实现思路】利用对象属性名不重复的思想,去解决重复问题;通过空对象作为媒介,每循环一组把不重复的值放入空对象中,过程中通过对象属性名的值的判断,删除掉数组中对应元素

特点:解决空间复杂度和时间复杂度问题,加快渲染速度

var ary = [2,3,4,2,34,223,2,3]
function no_rep(){
for(var i=0;i<ary.length;i++){
var obj = {};
  var value = ary[i];
  if(obj['value']=='undefined'){
  obj['value'] = 'value';
    
  }else{
  ary.splice(i,1);
    i--;
  }
}
  return ary;
}
console.log(ary);

【优化方法】对于splice引起的数组塌陷问题,塌陷一次,后边元素就要依次改变,比较消耗性能

优化方法:

  • 想办法让值删除后位置还会有元素占位
  • 把末尾元素提到这个位置
  • 最后一项删除
  • 需要注意,拉过来的最后一项的值还需要比较需要i--
var ary[1,2,3,2,1,3]
for(var i=0;i<ary.length;i++){
  var obj={}; 
  var value=ary[i];
   if(obj['value']=='undefined'){
   ary[i]=ary[ary.length-1];
     ary.length--;
     i--;
     continue;
   }
  
  obj[value]=value;
}

方法三:indexOf

创建一个新数组,遍历原数组,如果新数组中没有那一项,就把他push进去

/* 
  var ary2=[1,2,1,3,3,2,3];
  var newAry=[];
  把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组
*/

function unique(ary){
   var newAry=[];
   for(var i=0;i<ary.length;i++){
       var item=ary[i];
       if(newAry.indexOf(item)==-1){
        newAry.push(item);
       }
   }
   return newAry;
}
var ary2=[1,2,1,3,3,2,3];
var res=unique(ary2);
console.log(res);

二. 算法之冒泡排序

   /* 
   冒泡排序:
   从小到大排序
   var ary=[8,2,1,5]
   原理:依次拿出数组中的每一项给后面的一项做对比,如果当前项比后面的项大就交换位置
   第一轮:[2,1,5,8] 经过一轮比较出现了最大数
   第二轮:[1,5,2,8] 经过二轮比较得出倒数第2个数
   第三轮:[1,5,2,8]  经过二轮比较得出倒数第3个数
   .... 总共四项,经过比三轮,已经得到了三个最大数了,最后一个自然就是最小数
   【需要比的总轮数】:ary.length-1;
   【每次需要比的次数】:ary.length-1-已经比较过的轮数

   第一轮:4项两两比较需要比3次:ary.length-1
   第二轮: 正常的ary.length-1-已经比较过的轮数
   
   */

   function sort(ary){
       // 需要比较的轮数
       for(var i=0;i<ary.length-1;i++){
           for(var j=0;j<ary.length-1-i;j++){
              var current=ary[j];
              var next=ary[j+1];
              if(ary[j]>ary[j+1]){
                 // 让 ary[j]=ary[j+1]
                 var temp=ary[j]
                 ary[j]=ary[j+1];
                 ary[j+1]=temp;
                    
              }
           }
       }
       return ary;
   }

   var ary=[8,2,1,5];
   var res=sort(ary);

三. 递归

自己调自己

function total(num){
    if(num>10)return 0;
    return num + total(num+1);
}
console.log(total(1));