2023 美团笔试题 0415
笔试时间:2023年04月15日 春招
备注:第五题暂未有题解。
第一题
题目:字符串的前缀
现在有两个字符串S和T,你需要对S进行若干次操作,使得S是T的一个前缀(空串也是一个前缀)。每次操作可以修改S的一个字符,或者删除一个S末尾的字符。小团需要写一段程序,输出最少需要操作的次数。
输入描述
第一行一个正整数C,表示数据组数;
对于每一组数据输入两行仅包含小写字母的字符串S和T。
输出描述
对于每一组数据,输出一个整数,表示最少需要操作的次数。
样例输入
2
aba
abb
abcd
efg
样例输出
1
4
提示:
第一组数据,可以修改最后一个字母,使得S=abb,是T的一个前缀;第二组数据,需要将S整个串删除,操作次数为4。
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <string>
using namespace std;
int main() {
int C;
cin >> C;
cin.ignore(); // Ignore the newline after reading C
for (int i = 0; i < C; ++i) {
string S, T;
getline(cin, S);
getline(cin, T);
int res = 0;
int pos = 0;
if (S.length() > T.length()) {
res = S.length() - T.length();
pos = T.length() - 1;
} else {
pos = S.length() - 1;
}
bool flag = false;
while (pos >= 0) {
if (!flag) {
if (S[pos] == T[pos]) {
flag = true;
} else {
res++;
}
} else {
if (S[pos] != T[pos]) {
res++;
}
}
pos--;
}
cout << res << endl;
}
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int C = scanner.nextInt();
scanner.nextLine(); // Consume newline
for (int i = 0; i < C; ++i) {
String S = scanner.nextLine();
String T = scanner.nextLine();
int res = 0;
int pos = 0;
if (S.length() > T.length()) {
res = S.length() - T.length();
pos = T.length() - 1;
} else {
pos = S.length() - 1;
}
boolean flag = false;
while (pos >= 0) {
if (!flag) {
if (S.charAt(pos) == T.charAt(pos)) {
flag = true;
} else {
res++;
}
} else {
if (S.charAt(pos) != T.charAt(pos)) {
res++;
}
}
pos--;
}
System.out.println(res);
}
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
C = int(input())
for _ in range(C):
S = input()
T = input()
res, pos = 0, 0
if len(S) > len(T):
res = len(S) - len(T)
pos = len(T) - 1
else:
pos = len(S) - 1
flag = False
while pos >= 0:
if not flag:
if S[pos] == T[pos]:
flag = True
else:
res += 1
else:
if S[pos] != T[pos]: res += 1
pos -= 1
print(res)
第二题
题目:小美分糖
某一天,小美从商店买了两种糖果,分别买了a个和b个,要分给班上n个小朋友。为了不浪费,每块糖果都得恰好分到一个小朋友。另外,两种糖果一起吃的话味道其实并不好,所以每一个小朋友都只能得到其中一种糖果。小美希望分得最少糖果的那个小朋友能得到尽量多的糖果。小美的任务是求得这个数量是多少。
输入描述
第一行一个正整数T,表示有T组数据。
对于每一组数据,输入一行n,a,b,中间用空格隔开。
1≤a,b≤10000, 2≤n≤a+b, 1≤T≤100
输出描述
对于每一组数据,输出仅一行一个整数,表示答案。
样例输入
2
5 2 3
4 7 10
样例输出
1
3
提示:
第一组数据,每个小朋友都恰好分得一个糖果;第二组数据,可以分成:(3个第一种,4个第一种,5个第二种,5个第二种),这样第一个小朋友分得最少,没有其他方案使得分得最少的那个小朋友的糖果数量更大。
参考题解
二分答案。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
using namespace std;
bool check(long long x, long long n, long long a, long long b) {
long long r1 = min(a, b);
long long r2 = max(a, b);
long long cnt = 1;
r2 -= x;
cnt += (r2 / x) + (r1 / x);
return cnt >= n;
}
int main() {
int T;
cin >> T;
for (int t = 0; t < T; ++t) {
long long n, a, b;
cin >> n >> a >> b;
long long l = 0;
long long r = max(a, b);
while (l < r) {
long long mid = (l + r + 1) >> 1;
if (check(mid, n, a, b)) {
l = mid;
} else {
r = mid - 1;
}
}
cout << r << endl;
}
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
public class Main {
public static boolean check(long x, long n, long a, long b) {
long r1 = Math.min(a, b);
long r2 = Math.max(a, b);
long cnt = 1;
r2 -= x;
cnt += (r2 / x) + (r1 / x);
return cnt >= n;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
for (int t = 0; t < T; ++t) {
long n = scanner.nextLong();
long a = scanner.nextLong();
long b = scanner.nextLong();
long l = 0;
long r = Math.max(a, b);
while (l < r) {
long mid = (l + r + 1) >> 1;
if (check(mid, n, a, b)) {
l = mid;
} else {
r = mid - 1;
}
}
System.out.println(r);
}
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
T = int(input())
for _ in range(T):
n, a, b = map(int, input().strip().split(" "))
def check(x):
r1, r2 = min(a,b), max(a,b)
cnt = 1
r2 -= x
cnt += (r2 //x) + (r1 //x)
'''一个人分x 其他人x+1, 如果可以就ok'''
return cnt >= n
l, r = 0, max(a,b)
while l < r:
mid = (l + r + 1) >> 1
if check(mid):l = mid
else: r = mid - 1
print(r)
第三题
题目:交通规则
A国有n个城市,这n个城市排成一列,依次编号为1,2,3,...,n。一开始,这n座城市之间都没有任何交通路线,于是政府打算修建一些铁路来进行交通规划。接下来T天,每一天会进行如下操作的其中一种:- “L x”:表示编号为 x 的城市与其左边的城市之间修建一条铁路。如果 x 左边没有城市或者已经修建了铁路,则无视该操作;- “R x”:表示编号为 x 的城市与其右边的城市之间修建一条铁路。如果 x 右边没有城市或者已经修建了铁路,则无视该操作;- “Q x”:表示查询 x 往左边和往右边最远能到达的城市编号。你的任务是模拟以上操作,并对于每一条“Q x”操作,输出对应的答案。
输入描述
第一
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

