1. 程式人生 > >js實現常見的幾種演算法(陣列去重、字元統計、二分查詢等)

js實現常見的幾種演算法(陣列去重、字元統計、二分查詢等)

1、陣列去重:利用物件屬性進行篩選

 function filter(arr){
   let obj={};
   let newArr=[];
    for (let i=0;i<arr.length;i++){
       if (!obj[arr[i]])  {
          obj[arr[i]]=true;
          newArr.push(arr[i]);
       }      
   }
   return newArr;
}
利用ES6(set資料型別)快速實現:
let arr1 =[2,3,12,4,3,1,2]
function filter2(arr){
  return Array.from(new Set(arr));
} 
console.log(filter2(arr1));// 輸出[2, 3, 12, 4, 1]
2、統計字元次數(同樣利用物件屬性實現)
function staticsis(str){
  let obj ={},str1 =str.split(''),length = str1.length,char ='',count=1;
  if(length>0){
   for(let i=0;i<length;i++){
    let val = str1[i];
    obj[val] =(obj[val])? ++obj[val]:1;
   }  
   for(var key in obj){
     if(obj[key]>=count){
       count = obj[key];
       char = key;
     }
   }
  }
  return char;
}
staticsis('ssasaswwqwsssssss123')//返回's'

3、二分查詢:(針對升序列表,不斷進行二分,直到找到或者確定無)
function searHalf(arr,val){
 let length = arr.length,low =0,high=length-1;
 while(low<=high){
  let mid = Math.floor((high+low)/2);
  if(arr[mid]===val){return mid;}
  else if(arr[mid]<val){low =mid+1;}
  else if(arr[mid]>val){high=mid-1;}
 }
 return -1;
}
4、不借助第三個變數交換兩個變數值(交換律與結合律)
function swap(a,b){
  b = b-a;
  a = a+b; //a=a+(b-a)=b;
  b = a-b; //b=a-b=b-(b-a)=a
}
5、斐波那契數列(非遞迴實現)
function fibo(n){
 let arr=[];
 if(n>0){
  arr[0] =0;
  if(n==1){return arr;}
  arr[1] =1;
  for(let i=2;i<n;i++){
   arr[i] = arr[i-1]+arr[i-2];
  }
 }
 return arr;
}
6、隨機生成字串
function randomStr(n){
  let str='abcdefghijkmnopqrstuvwxyz9876543210',newStr='',m =str.length;
  for(let i=0;i<n;i++){
    newStr+=str.charAt(Math.floor(Math.random()*m))
    }
    return newStr;
  }