几道算法题

2023-04-13 23:06 算法 117 0
1.队列相关一、实现一个队列函数,保持最多两个任务同时进行,多余的任务进行排队,待某一个任务完成后再按照顺序执行下一个任务例如addTrack(1000,1)addTrack(200,2)addTrack(500,3)addTrack(900,4)//输出如下结果//200ms后输出2//700ms后输出3//1000ms后输出1//1600ms后输出4实现letdoing=0//正在请求的数量constwating=[]//等待请求的数组lettime=Date.now()functioncall(element){setTimeout(()=>{console.log(element.value,Date.now()-time)//正在请求-1doing--//如果还有数组长度,取先进来的执行if(wating.length>0){doing++call(wating[0])//记得从等待的数组删除wating.shift()}},element.time);}functionaddTrack(time,value){constelement={time,value}//小于2直接执行if(doing<2){doing++call(element)}else{wating.push(element)}}addTrack(1000,1)addTrack(200,2)addTrack(500,3)addTrack(900,4)运行结果二、为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务,假设GPU最多一次执行n个任务,一次执行耗时1秒,在保证GPU不空闲情况下,最少需要多长时间执行完成例如输入:3,[1,2,3,4,5]输出:6输入:4,[5,4,1,1,1]输出:5实现functionminExecutionTime(maxExec,tasks){letremaining=0,time=0for(lettaskoftasks){if(task+remaining>maxExec){remaining=task+remaining-maxExec;}else{remaining=0;}time+=1;}while(remaining>0){remaining-=maxExec;time+=1;}returntime}console.log(minExecutionTime(3,[1,2,3,4,5]));console.log(minExecutionTime(4,[5,4,1,1,1]));运行结果2.排序相关一、输入一个数字数组,输出其全部递增元素数组例如increment([1,5,4,7,8,4])increment([5,4,3,7,8])increment([5,4,3,2,1])//输出如下结果//[[1,5],[4,7,8]]//[[3,7,8]]//[]实现functionincrement(arrIn){letincrementTemp=[]//缓存比较结果constarrOut=[]//返回结果arrIn.forEach((el,index)=>{//第一项直接push,不需要比较if(index===0){incrementTemp.push(el)return}constlen=incrementTemp.lengthconstlastEl=incrementTemp[len-1]//判断是否比前一个大if(el>lastEl){incrementTemp.push(el)}else{//判断是否多于两个,是则为递增数列if(len>1){//不能直接arrOut.push(incrementTemp),incrementTemp会被后续清空arrOut.push([...incrementTemp])}//将值的作为下一次比较incrementTemp=[el]}});//循环完毕还需要将incrementTemp放入if(incrementTemp.length>1){arrOut.push([...incrementTemp])}console.log(JSON.stringify(arrOut));returnarrOut}运行结果二、蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。例如当输入5时,应该输出的三角形为:136101525914481371211当输入4时,应该输出的三角形为:13610259487实现//观察数字填入规律可知//行为递减,列为递增//比如输入4,则为//[0,0][1,0][0,1][2,0][1,1][0,2][3,0][2,1][1,2][0,3]functionfunc(value){constarr=[]//矩阵存放letn=1//递增值for(leti=0;i<value;i++){for(letj=0;j<=i;j++){constleft=i-jconstright=jif(arr[left]){arr[left][right]=n++}else{arr[left]=[n++]}}}arr.forEach(v=>{console.log(v.join(''))})}运行结果3.链表相关一、将一个节点数为size链表m位置到n位置之间的区间反转例如输入:{1,2,3,4,5},2,4返回值:{1,4,3,2,5}实现classHeadNode{value=0next=nullconstructor(value,next){this.value=valuethis.next=next}}/***打印链表内容*/functionlogHeadNode(headNode){letlog=[]cur=headNodewhile(cur){log.push(cur.value)cur=cur.next}console.log(log.join(','))}lethead=newHeadNode(0,null)letheadNode=headfor(leti=1;i<5;i++){letnode=newHeadNode(i,null)head.next=nodehead=node}logHeadNode(headNode)/***转化方法*/functiontransform(headNode,m,n){letstart=null,end=null,cur=headNode//找到两个要反转的前后节点for(leti=1;i<=n;i++){if(i===m-1){start=cur}cur=cur.next}end=cur//如果不是第一个位置if(m>1){letpre=nullcur=start.nextwhile(cur!==end){lettmp=cur.nextcur.next=prepre=curcur=tmp}start.next.next=endstart.next=pre}else{letpre=headNodecur=headNode.nextwhile(cur!==end){lettmp=cur.nextcur.next=prepre=curcur=tmp}headNode.next=endheadNode=pre}returnheadNode}constheadNode2=transform(headNode,2,4)logHeadNode(headNode2)运行结果4.滑动窗口一、给定一个矩阵,包含N*M个整数,和一个包含K个整数的数组。现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数例如输入:[[1,2,3],[3,5,6]],[3,6]返回值:1输入:[[1,2,3],[3,5,6]],[1,6]返回值:3输入:[[1,0,1,4],[0,0,7,8],[1,0,11,12],[0,0,15,16]],[1,0,1,0,1,0]返回值:3实现functionminSubmatrixWidth(matrix,nums){constrow=matrix.length,col=matrix[0].length;letminWidth=Infinity;//从第一列开始滑动for(leti=0;i<col;i++){//拷贝一份nums用于计算constnumsCopy=[...nums];//第二列以当前列开始for(letj=i;j<col;j++){//循环nums找到出现的数字进行删除for(letk=0;k<row;k++){constnum=matrix[k][j];constindex=numsCopy.indexOf(num);if(index!==-1){numsCopy.splice(index,1);}//如果nums长度为0,说明全部包含了num,跳出行遍历if(numsCopy.length===0){minWidth=Math.min(minWidth,j-i+1);//宽度为1,肯定是最小,直接返回1即可if(minWidth===1){return1}break}}//如果nums长度为0,说明全部包含了,跳出这次滑动if(numsCopy.length===0){break}}}returnminWidth}//计算最小宽度的子矩阵console.log(minSubmatrixWidth([[1,2,3],[3,5,6]],[3,6]));console.log(minSubmatrixWidth([[1,2,3],[3,5,6]],[1,6]));console.log(minSubmatrixWidth([[1,2,3],[3,5,6]],[4]));console.log(minSubmatrixWidth([[1,0,1,4],[0,0,7,8],[1,0,11,12],[0,0,15,16]],[1,0,1,0,1,0]));运行结果
暂无评论,我会出手
说点什么
登录用户可以修改和删除评论,可以收到回复的邮件提醒点击登录/注册
最多上传8张图片,仅支持jpg,png格式图片,单张大小5MB以内!
用户名: