4.9 美团笔试AK

每个题的详细思路慢慢补吧

第一题 (AC)

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        long yitiam=24*60L;

        Scanner sc = new Scanner(System.in);
        long day=sc.nextLong();//当前是第几天
        String str=sc.next();
        String[] split = str.split(":");
        long shi=Long.parseLong(split[0]);//当前的小时
        long fen=Long.parseLong(split[1]);//当前的分钟
        long qian=sc.nextLong();//要提前的时间
        long tot=0;
        qian%=(7L*yitiam);
        tot=yitiam*(day-1)+shi*60L+fen;

        tot=(tot+(7L*yitiam)-qian)%(7L*yitiam);

        day=tot/yitiam;
        day+=1;


        shi=(tot%(yitiam))/60L;
        fen=(tot%(yitiam))%60L;

        System.out.println(day);
        //if(shi<10) System.out.print("0");
        //System.out.print(shi+":");
        //if(fen<10) System.out.print("0");
        //System.out.println(fen);
        //更新输出方式
        System.out.printf("%02d:%02d",shi,fen);//0代表不足的部分用0补齐,2代表以两位整数的形式输出
    }
}

第二题(1发AC)

思路:

简单思维题吧

import java.util.HashMap;
import java.util.Scanner;


public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        int a[]=new int[n];
        int b[]=new int[n];
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i=0;i<n;i++)a[i]=sc.nextInt();
        for(int i=0;i<n;i++){
            map.put(a[i],i);
        }

        for(int i=0;i<n;i++)b[i]=sc.nextInt();
        int min=0;
        int ans=0;
        for(int i=n-1;i>=0;i--){
            if(i==n-1){
                min=map.get(b[i]);
                continue;
            }
            if(map.get(b[i])>min)ans++;
            min=Math.min(min,map.get(b[i]));
        }
        System.out.println(ans);
    }
}

第三题(1发AC)

思路

二分x,然后暴力判断即可

import java.util.HashMap;
import java.util.Scanner;

/**
 * @Author: Shang Huaipeng

 * @Version 1.0
 */

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        long n=sc.nextLong();
        long k=sc.nextLong();
        long l=1;
        long r=n+1;
        while(l<r){
            long mid=(l+r)/2;

            if(judge(mid,n,k))r=mid;
            else l=mid+1;
        }
        System.out.println(l);
    }

    private static boolean judge(long x,long n,long k){
        long tmp=x;
        while(n>0){
            n-=x;
            x/=k;
            if(x<=0)break;
        }

        return n<=0;
    }
}

第四题(AC)

思路:简单dp

这个题我严重吐槽,n=0的时候答案是1,我一直以为是0,发散思维是应该的,但是这种边界不说明一下吗?
本来一发就能过,最后交了20多发

#include<bits/stdc++.h>

using namespace std;

int main()
{
    long long mod=1000000007L;
    int n=0;
    cin>>n;
    long long tot[4];
    long long tmp[4];
    for(int i=0;i<4;i++){
        tot[i]=tmp[i]=0;
    }
    tot[0]=1;
    long ans=0;
    for(int t=0;t<n;t++){
        for(int i=0;i<4;i++)tmp[i]=tot[i];
        for(int i=0;i<4;i++){
            tot[i]=0;
            for(int j=0;j<4;j++){
                if(i==j)continue;
                tot[i]=(tot[i]+tmp[j]);
            }
            tot[i]%=mod;
        }
    }
    ans=tot[0];
    cout<<ans;
    return 0;
}

第五题(2发AC)

思路

暴力记录出现的次数即可

注意

美团这个笔试平台,java语言加上包名算错,第一发死这上面了

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * @Author: Shang Huaipeng

 * @Version 1.0
 */

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        int k=sc.nextInt();
        String s[]=new String[k+1];
        boolean de[]=new boolean[k+1];
        for(int i=1;i<=k;i++){
            s[i]=sc.next();
        }
        String str="";
        LinkedList<Integer> sum = new LinkedList<>();
        for(int kkk=0;kkk<n;kkk++){
            str=sc.next();

            if(str.charAt(0)=='-'){
                de[Integer.parseInt(str.substring(1,str.length()))]=true;
            }
            else if(str.charAt(0)=='+'){
                de[Integer.parseInt(str.substring(1,str.length()))]=false;
            }
            else{
                int ans=0;
                String mo = str.substring(1, str.length());
                for(int i=1;i<=k;i++){
                    if(de[i])continue;
                    int index=0;
                    while(true){
                        int tmp=mo.indexOf(s[i],index);
                        //System.out.println(tmp);
                        if(tmp==-1)break;
                        index=tmp+1;
                        ans++;
                    }
                }
                sum.add(ans);
            }
        }
        for (Integer integer : sum) {
            System.out.println(integer);
        }
    }
}
#美团笔试##美团##笔试题目#
全部评论
好久没看到AK这个词了
1 回复
分享
发布于 2020-04-09 21:40
&大佬!
点赞 回复
分享
发布于 2020-04-09 21:47
滴滴
校招火热招聘中
官网直投
看了下第五题,那应该是我自己想多了,我的思路: 前面和你一样,+和-操作是O(1)的 然后?把每一个母串都用map保存,同时存的还有对应子串的结果: {母串:{子串1:n1, 子串2:n2}} 然后估计是有bug没调出来
点赞 回复
分享
发布于 2020-04-09 22:24
大佬
点赞 回复
分享
发布于 2020-04-09 22:41
&太强了,大佬搞算法的吗
点赞 回复
分享
发布于 2020-04-09 23:09
大佬是美团点评嘛?我估计就是被你给挤了
点赞 回复
分享
发布于 2020-04-10 08:44
大佬牛逼啊,请问有题目吗?我也想看看
点赞 回复
分享
发布于 2020-04-10 11:36
第1题的小时,分钟小与于10的时候,我竟然用字符串把0添加进去了,然后再去一次性输出,看到大佬的分步打印,哭了
点赞 回复
分享
发布于 2020-04-10 11:52

相关推荐

头像
点赞 评论 收藏
转发
19 31 评论
分享
牛客网
牛客企业服务