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); } } }#美团笔试##美团##笔试题目#