当前位置: 首页 > Web前端 > JavaScript

美团后台笔试

时间:2023-03-27 17:20:11 JavaScript

文章目录整个笔试下来,整体难度一般,但是扑克牌第三题不是很顺利,附加题难度一般。不知道有没有朋友和我一样把时间浪费在了第三个问题上。1.魔法外卖话题描述:炸鸡店有一个可以传送魔法的外卖送货员。外卖送餐员送餐时,可以花费时间t正常送餐(一次只能送餐单,多餐不能同时送餐),也可以使用魔法瞬间送餐不费时地穿过空气。现在炸鸡店在时间0收到了几个炸鸡订单,每个订单都有它的交货期限。外卖送货员需保证送货时间小于或等于该截止时间。现在问一下送货员最少要用多少次魔法才能保证不送货超时。输入说明:第一行两个正整数n和t之间用空格隔开,表示当前收到n个订单,送货员在不使用魔法的情况下正常送货的时间t。第二行包含n个正整数,每个正整数代表一个订单的截止交货时间。1<=n<=1e5,1<=t<=100,订单的发货时间在[1,1e7]之间人需要使用。样例输入655678910样例输出4这道题的思路很简单,我们只需要保证我们送上一个的时间+t(送下一个外卖所耗费的时间)更少即可等于或等于下次外卖的截止时间即可。代码如下:importjava.util.Arrays;导入java.util.Scanner;公共类魔法外卖{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);intn=scanner.nextInt();intt=scanner.nextInt();int[]次=newint[n];对于(inti=0;i=楼层数-1,那么可能无法清扫,因为有些命令到达的位置很可能已经清扫过了,所以我们需要记录下那个位置已经清理干净。代码如下:importjava.util.ArrayList;导入java.util.List;导入java.util.Scanner;publicclasscleaningroom{publicstaticbooleancontainsVal(Listlist,inti,intj){for(intk=0;klist=newArrayList<>();list.add(newint[]{0,0});//初始位置已清理inti=0,j=0;//初始值for(charop:opt){switch(String.valueOf(op)){case"W"://upif(i-1>=0){i-=1;int[]t=newint[]{i,j};如果(!containsVal(list,i,j)){count++;list.add(t);}}休息;case"A"://leftif(j-1>=0){j-=1;int[]t=newint[]{i,j};如果(!containsVal(list,i,j)){count++;list.add(t);}}休息;case"S"://向下if(i+1=m*n){休息;}}if(count>=m*n){System.out.println("是");System.out.println(lastOp);}else{System.out.println("否");System.out.println(n*m-list.size());}}}}3.扑克牌游戏题目描述:Alice和Bob正在玩n张牌的游戏,点数为1到n。洗牌后,将n张牌从上到下叠成一堆。每次爱丽丝将当前牌堆顶牌放在牌堆底,然后鲍勃将当前牌堆顶牌放在牌堆底。(特别是,当牌组只有一张牌时,相当于什么都不做。)然后,翻开当前牌组最上面的一张牌,记下它的点数。当所有的牌都翻完后,他们也记下了n点。现在他们要按照自己写下的顺序恢复原来的牌(每张牌从牌堆顶到牌底的点数)。输入说明:第一行是一个正整数n,表示有n张牌。下一行是n个用空格隔开的正整数,第i个数a_i代表翻开的第i张牌的点数。1<=n<=100000输出说明:一行n个正整数,中间用空格隔开,第i个数代表初始牌组中从牌堆顶到牌底的第i张牌的点数.样例输入:样例输出:4213这道题做了很久,因为一直想着通过递归剪枝的方法来尝试恢复初始的卡点,然后仔细分析了一下。思路错误,题目本身就已经暗示了我们使用队列进行处理,所以按照题主的思路通过双端队列+逆向模拟就可以轻松解决。Instructions里面为了不让大家看不懂,先给大家复习一下:其中Queue就是我们普通的队列。与双端队列Deque不同,它不支持从队头添加元素和从队尾删除元素。对于这道题,题中给出的顺序是从a[]数组的第0位开始,将两张牌依次放在a[]数组的末尾,然后抽一张牌并记录点数,我们就翻过来,从a[length-1]开始的位置进行同样的操作,即从队尾抽两张牌放在队头,再抽一张牌,那么这张牌对应的是真实的s位置。代码如下:importjava.util.*;公共类扑克游戏{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);intn=scanner.nextInt();int[]卡片=newint[n];对于(inti=0;ideque=newLinkedList();对于(inti=0;imap=newHashMap<>();对于(intk=0;kcpMap=newHashMap<>(map);for(intj=i+1;jqueue=newLinkedList<>();queue.add(1);整数计数=0;while(!queue.isEmpty()){intindex=queue.poll();计数++;if(index==1){//说明是根节点dp[index]=moneys[index];}elseif(index%2==0){//说明是左子树dp[index]=dp[index/2]+moneys[count];}else{//说明是右子树dp[index]=dp[(index-1)/2]+moneys[count];}if(index*2<=n){queue.add(index*2);}if(index*2+1<=n){queue.add(index*2+1);}}//找到最大值intans=dp[1];for(inti:dp){ans=Math.max(i,ans);}System.out.println(ans);}}