贝壳2020秋招前端笔试

第一题

// 1. 输入一个字符串,输出最小替换几次,可以使这个字符串变成回文字符串
function foo1(str){
    let left = 0, right = str.length-1;
    let res = 0; 
    while(left<right){
        if(str[left++] != str[right--]){
            res++;
        }
    }
    return res;
}

第二题

// 2. 染色问题, 给出N*M 个格子,要使每个格子的颜色不同,则最小使用多少种颜色
// 自测了没什么问题 结果是80%
function foo2(n,m){
    if(n == 1 && m==1){
        return 1;
    }
    let temp = n*m;
    let maxvalue = Math.floor(Math.sqrt(temp));
    for(let i = 2 ; i<=maxvalue;++i){
        if(temp%i == 0){
            return i;
        }
    }
    return temp;
}

第三题

// 3. 在一个N*M 的格子中,问从(1,1)点走到(N,M)点有多少条路径,可以往上往左往右走。结果对10e9+7取模
// 其实这个问题求的是M的n-1次方。
function foo3_1(n,m){
    //这个方法只通过了40%
    const MOD = 10e9+7;
    n--;
    let res = 1;
    while(n){
        if(n&1){
            res*=m;
            res%=MOD;
        }
        n = n>>1;
        m = m*m;
        m%=MOD;
    }
    return res;
}

function foo3_2(n,m){
    //对两个数的乘法进行优化,这个方法通过了90%
    const MOD = 10e9+7;
    const mulit = (a,b)=>{
        let str = a +''+b;
        if(str.length<16){
            return a*b%MOD;
        }
        let res = 0;
        while(a>0){
            if(a&1){
                res+=b;
                res%=MOD;
            }
            a = a>>1;
            b*=2;
            b%=MOD;
        }
        return res;
    }
    n--;
    let res = 1;
    while(n){
        if(n&1){
            res = mulit(res, m);
        }
        n = n>>1;
        m = mulit(m,m);
        m%=MOD;
    }
    return res;
}

第四题


// 4. 给出一个区间数组,求可以最多的不重叠的区间数量
// 例如[[1,2],[2,3],[3,4]] 答案是 2 ,[1,2] 和[3,4]
function foo4(arr){
    if(arr.length<2){
        return arr.length;
    }
    arr.sort((a,b)=>a[1]-b[1]);
    let pre = arr[0][1];
    let res = 1;
    for(let i = 1 ;i< arr.length;++i){
        if(pre<arr[i][0]){
            pre = arr[i][1];
            res++;
        }
    }
    return res;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值