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