算法题算法题!!!!

0223
在这里插入图片描述
思路:先计算出老板没控制自己的情绪时的满意数量sum,再根据X的值,维护一个滑动窗口,遍历grumpy数组,计算增加的满意数量add,选取最大的一个,最后返回结果(sum+add)。

var maxSatisfied = function(customers, grumpy, X) {
    let sum=0;
    let add=0;
    for(let i=0;i<customers.length;i++){
        if(grumpy[i]==0){
            sum+=customers[i];
        }
    }
    //console.log(sum);
    for(let i=0;i<grumpy.length;i++){
        let x=X;
        let j=i;
        let temp=0;//设置一个临时变量,记录增加的值
        while(x){//不能直接用X,因为后续会改变X值变为0
            if(grumpy[j]==1){//此时的j为i的值,同上,不能直接用i
                temp+=customers[j];
            }
            j++;
            x--;
        }
        if(temp>add){
            add=temp;//取结果较大的add
        }
    }
    //console.log(add);
    return sum+add;
};

0317
找出数组中第K大的数

function findMax(arr,K){
    arr=[...new Set(arr)]
    arr.sort((a,b)=>{return a-b;})
    return arr[K-1];
}
console.log(findMax([5,1,2,4,4,8,11,13],2))

0318
给定若干个有限小数或者无限循环小数组成的求和表达式,请将小数转化为最简分数表示形式,并求和。
输入描述: 整数部分零不省略,小数部分中循环节用括号标记出来
输出描述:将表达式转换为最简分数形式,并求和

样例输入:2.00+0.46+0.25(285714)
样例输出:2+23/50+177/700=1899/700

let s='2.00+3.01+0.25(285714)'
// let s='2.00+0.46+1.25(285714)'
// let s='2.00+0.46'
let arr=s.split('+');
let left=[];//左边算式
let fenmuRec=[];//记录转为分数后的分母,便于求最小公倍数
for(let i=0;i<arr.length;i++){
    let temp=arr[i].split('.');   
    toFenshu(temp);
}
let maxGys=maxGYS(fenmuRec);//最大公约数
// console.log(maxGys)
let fenziRight=fenziResult(left,maxGys);
let [a,b]=huajian(fenziRight,maxGys);
// console.log(left.join('+')+'='+fenziRight+'/'+maxGys)
console.log(left.join('+')+'='+a+'/'+b)

function toFenshu(temp){//转换为最简分数式
    if(temp[1]==0){//整数
        left.push(temp[0])
        fenmuRec.push(1);
    }
    else{
        if(temp[1].includes('(')){//无限循环小数
            // console.log('无限循环小数')
            let index1=temp[1].indexOf('(');
            let index2=temp[1].indexOf(')');
            let xiaoshu=temp[1].slice(0,index1);//正常小数部分
            let xunhuan=temp[1].slice(index1+1,index2);//取出循环部分小数
            let fenmu1=1;
            let fenmu2='';
            for(let i=0;i<xiaoshu.length;i++){
                fenmu1*=10;
            }
            for(let j=0;j<xunhuan.length;j++){//循环数有几位,就除以几个9
                fenmu2+='9';                
            }
            //进行化简,就要得出循环小数此时的分子和分母
            //如0.25(285714) => 285714/((999999)*100)+25/100 
            //               => 285714+(25*999999)/((999999)*100)
            //如1.25(285714) => 1+285714/((999999)*100)+25/100
            //               => (((999999)*100)+285714+(25*999999))(分子)
            //               => (999999)*100 (分母)
            let fenmu=fenmu1*Number(fenmu2);
            let fenzi=(Number(temp[0])*fenmu)+Number(xunhuan)+(xiaoshu*Number(fenmu2));
            let [a,b]=huajian(fenzi,fenmu);   
            left.push(a+'/'+b)
            fenmuRec.push(b);//记录分母,便于后期计算最小公倍数
        }else{//有限小数
            let fenmu=1;
            for(let i=0;i<temp[1].length;i++){
                fenmu*=10;
            }
            let fenzi=(temp[0]*fenmu)+Number(temp[1]);          
            let [a,b]=huajian(fenzi,fenmu);   
            left.push(a+'/'+b)
            fenmuRec.push(b);//记录分母,便于后期计算最小公倍数
        }
    }

}
function huajian(fenzi,fenmu){//分式化简
    for(let i=2;i<=Math.min(fenzi,fenmu);i++){//计算最简式分子分母
        if((fenzi%i==0)&&(fenmu%i==0)){
            fenzi/=i;
            fenmu/=i;
            i=1;
        }
    }
    return [fenzi,fenmu];
}
function maxGYS(fenmuRec){//最大公约数
    // console.log(fenmuRec)
    let ret=Math.min.apply(null,fenmuRec);
    // console.log(ret)
    for(let i=0;i<fenmuRec.length;i++){
        if((fenmuRec[i]%ret==0)&&fenmuRec[i]>ret){
            ret=fenmuRec[i];
        }
        else{
            ret*=fenmuRec[i];
        }
    }
    return ret;
}
function fenziResult(left,maxGys){//求出最终结果的分
    let fenzi=0;
    for(let i=0;i<left.length;i++){
        if(left[i].includes('/')){
            let temp=left[i].split('/');
            fenzi+=(maxGys/temp[1])*temp[0];
        }else{
            fenzi+=left[i]*maxGys;
        }
    }
    return fenzi;
}

0319
二叉树!!!!

1、求二叉树深度(迭代)

function depth(root){
    if(!root)return 0;
    return Math.max(depth(root.left),depth(root.right))+1;
}

2、二叉树层序遍历

var levelOrder = function(root) {
    let ret=[];
    if(!root)return ret;
    let quene=[root];
    while(quene.length){
        let levelarr=[];
        let len=quene.length;
        for(let i=0;i<len;i++){
            let node=quene.shift();
            // console.log(node);
            levelarr.push(node.val);
            // console.log(levelarr)
            (node.left)&&quene.push(node.left);
            (node.right)&&quene.push(node.right);
        }
        ret.push(levelarr);
    }
    return ret;
};

0321
在这里插入图片描述在这里插入图片描述

var setZeroes = function(matrix) {
    let copy=[];//设一个标志数组
    for(let i=0;i<matrix.length;i++){ 
        copy[i]=[];
        for(let j=0;j<matrix[0].length;j++){ 
            if(matrix[i][j]==0)copy[i][j]=0;//原数组为0的地方标记为0,作为后续判断条件
            else copy[i][j]=1;//标记为1,表示可改          
        }
    }
    for(let i=0;i<matrix.length;i++){     
        for(let j=0;j<matrix[0].length;j++){ 
            if(matrix[i][j]==0&&copy[i][j]==0){
                const tempi=i,tempj=j;
                for(let x=0;x<matrix[0].length;x++){
                    (copy[tempi][x])==1&&(matrix[tempi][x]=0)&&(copy[tempi][x]=0);//已更改为0,不能再次识别为0
                }
                for(let y=0;y<matrix.length;y++){
                    (copy[y][tempj])==1&&(matrix[y][tempj]=0)&&(copy[y][tempj]=0);//已更改为0,不能再次识别为0
                }
            }
        }
    }
    return matrix;
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值