经典JS算法

例题1:数组去重

输入:[1,2,2,,6,,10,9,1,3,]

输出:[1,2,6,10,9,1,3]

条件:去掉空、保持输入顺序

function dedupe(arr){
    let setArr = new Set(); 
    let res = [];
    for(let k in arr){
         //元素不为空、并且没有在setArr出现过
        if( arr[k] != null && !setArr.has(arr[k])){
            res.push(arr[k]);
            setArr.add(arr[k]);
        }
    } 
    return res;
}

例2:数组扁平化方案

输入: [[1,2,3],[2,4,5],[6,7,8,9,[10,11,12,[14]]]]

输出:[1,2,3,4,5,6,7,8,9,10,11,12,14]

方案一:ES6新特性flat

  function flatten(arr){
        return  arr.flat(Infinity);
        
    }
    let arr  = [[1,2,3],[2,4,5],[6,7,8,[10,11,12,[14]]]];
    console.log(flatten(arr));

方案二:toString + splict

 function flatten(arr){
        arr =  arr.toString().split(',').map(item => parseFloat(item));
        return arr;
    }
 let arr  = [[1,2,3],[2,4,5],[6,7,8,[10,11,12,[14]]]];
    console.log(flatten(arr));

方案三:递归

    function flatten(arr){
        let res = [];
        arr.map(item =>{

            //Array.isArray(obj) obj 需要检测的值。如果值是 Array,则为true; 否则为false。
            if (Array.isArray(item)){
                res = res.concat(flatten(item));
            }else{
                res.push(item);
            }
        });
        return res;
    }
    let arr  = [[1,2,3],[2,4,5],[6,7,8,[10,11,12,[14]]]];
    console.log(flatten(arr));

例2:数组乱序

输入:[1,2,3,4,5,6,7,8,9]

输出:乱序的数组

方案一:一般化方法

//一般化方法
        function shuffle(array){
            let copy = [];
            let n= array.length;
            let i;
            while(n){
                i = Math.floor(Math.random()*array.length);
                //如果这个元素之前没有被选中过
                if( i in array){
                   copy.push(array[i]);
                   delete array[i];
                   n--;
                }
            }
            return copy;
        }
    let array = [1,2,3,4,5,6,7,8,9]
    console.log( shuffle(array));

方案二:洗牌算法

    function shuffle(arr) {
        let n = array.length;
      while(n){
          let i = Math.floor(Math.random()*n--);
          [arr[i],arr[n]] = [arr[n],arr[i]];
      }
      return arr;
    }
    let array = [1,2,'2','sss',4,5,6,7,8,9]
    console.log(shuffle(array));

例3:不使用临时变量交换两个变量

方法一:使用ES6语法,使用是解构的性质

    let a = 1;
    let b =2;
 
    [a,b] =[b,a];
    console.log(a,b);

方法二:借助加减法

    let a = 1;
    let b =2;
   
     a = a - b;//a = -1
     b = b + a;//b = 2+(-1) =1
     a = b - a;//1-(-1) = 2
   
    console.log(a,b);

方法三:借助异或

    let a = 1;
    let b =2;
    
    a = a ^ b;// a = 0001 ^ 0010 = 0011
    b = a ^ b;// b = 0011 ^ 0010 = 0001;
    a = a ^ b;// a  = 0011 ^ 0001 = 0010;
    console.log(a,b);

例4:统计出现次数最多的字符

 function findMaxDuplicateChar(str) {
        //str长度为1
        if(str.length==1){
            return str;
        }
        let charObj ={};
        //遍历字符串str的每个字符,生成键值对存入charObj对象中
        for(let i = 0; i <str.length; i++){
            if (!charObj[str.charAt(i)]){
                charObj[str.charAt(i)] = 1;
            }else {
                charObj[str.charAt(i)] += 1;
            }
        }
       //遍历键值对、找值最大的键、即相应出现次数最多的字符
        let maxChar = '', maxValue = 1;
        for(let k in charObj){
            if(charObj[k] > maxValue){
                maxChar = k;
                maxValue = charObj[k];
            }
        }
        return maxChar;
    }
    let str = "a...aaa??abbbb333dd4444dsssi55iiio!!!===ooooo";
    console.log(findMaxDuplicateChar(str));

持续更新……

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值