携程笔试 携程笔试题 0416
笔试时间:2024年04月16日
历史笔试传送门:2023秋招笔试合集
第一题
题目
游游拿到了一个仅由小写字母组成的字符串,她准备向其中添加一些'0'字符,使得操作后的字符串中,有尽可能多的连续子串恰好等于"you"。游游想知道最少需要添加几个字符?
输入描述
一个仅包含小写字母的字符串,长度不超过200000。
输出描述
一个整数,代表游游最少添加的字符。
样例输入
yuyouy
样例输出
1
参考题解
只需要找到所有的"yu"即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int ans = 0;
for (size_t i = 0; i < s.length() - 1; i++) {
if (s.substr(i, 2) == "yu") {
ans++;
}
}
cout << ans << endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
int ans = 0;
for (int i = 0; i < s.length() - 1; i++) {
if (s.substring(i, i + 2).equals("yu")) {
ans++;
}
}
System.out.println(ans);
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
s = input()
ans = 0
for i in range(len(s) - 1):
if s[i:i+2] == "yu":
ans += 1
print(ans)
第二题
题目
游游拿到了3个大小为n的数组a, b, c。他准备重排c数组,使得有尽可能多的下表i满足ai + bi = ci,你能帮帮他吗?
输入描述
第一行输入一个正整数n,代表三个数组的大小
第二行输出n个正整数ai
第三行输出n个正整数bi
第四行输出n个正整数ci
1<=n<=1e5,1<=ai,bi,ci<=2e9
输出描述
一个整数,代表满足ai+bi=ci的i的数量。
样例输入
4,[1,2,3,4],[2,3,4,5],[4,5,6,7]
样例输出
2
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <unordered_map>
using namespace std;
const int MAXN = 100010;
long long a[MAXN];
unordered_map<long long, long long> mp;
unordered_map<long long, long long> st;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
long long ans = 0;
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++) {
long long x;
cin >> x;
a[i] += x;
mp[a[i]]++;
}
for (int i = 1; i <= n; i++) {
long long x;
cin >> x;
st[x]++;
}
for (const auto &entry : st) {
long long key = entry.first;
long long value = entry.second;
ans += min(value, mp[key]);
}
cout << ans << endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
static long[] a = new long[100010];
static Map<Long, Long> mp = new HashMap<>();
static Map<Long, Long> st = new HashMap<>();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long ans = 0;
int n = scanner.nextInt();
for (int i = 1; i <= n; i++)
a[i] = scanner.nextLong();
for (int i = 1; i <= n; i++) {
long x = scanner.nextLong();
a[i] += x;
mp.put(a[i], mp.getOrDefault(a[i], 0L) + 1);
}
for (int i = 1; i <= n; i++) {
long x = scanner.nextLong();
st.put(x, st.getOrDefault(x, 0L) + 1);
}
for (Map.Entry<Long, Long> entry : st.entrySet()) {
long key = entry.getKey();
long value = entry.getValue();
ans += Math.min(value, mp.getOrDefault(key, 0L));
}
System.out.println(ans);
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
from collections import defaultdict
a = [0] * 100010
mp = defaultdict(int)
st = defaultdict(int)
n = int(input())
for i in range(1, n + 1):
a[i] = int(input())
for i in range(1, n + 1):
x = int(input())
a[i] += x
mp[a[i]] += 1
for i in range(1, n + 1):
x = int(input())
st[x] += 1
ans = 0
for key, value in st.items():
ans += min(value, mp[key])
print(ans)
第三题
题目
游游拿到了一个数组,她每次操作可以将相邻的两个素数元素进行合并,合并后的新数为原来的两个数之和,并删除原来两个数。游游希望最终数组的元素数量尽可能少,你能帮帮她吗?
输入描述
第一行输入一个正整数n,代表数组的大小。
第二行输入n个正整数a;,代表数组的元素:
1<=n<=1e5 ,1<=ai<=1e6
输出描述
合并结束后的元素数量。
样例输入
5, [1, 3, 2, 5, 4]
样例输出
3
说明
先合并3、2,数组变为[1,5,5,4],然后合并5、5,变成[1,10,4],所以最后长度为3。
参考题解
因为除了2以外的素数都是奇数,奇数加奇数一定为合数,而2和一个素数相加,依然可能为素数,所以先处理2,将2和附近能合并的素数且合并之后依然为素数的数合并,然后用栈依次遍历处理即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
const int MAXN = 100010;
const int MAXP = 10000010;
int a[MAXN];
int prime[MAXP];
bool st[MAXP];
stack<long long> s;
bool check(long long x) {
if (x <= MAXP) return !st[x];
for (int j = 0; prime[j] <= x / prime[j]; j++) {
if (x % prime[j] == 0) return false;
}
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
st[0] = st[1] = true;
int cnt = 0;
for (int i = 2; i <= 1e7; i++) {
if (!st[i]) prime[cnt++] = i;
for (int j = 0; j < cnt && prime[j] <= 1e7 / i; j++) {
st[i * prime[j]] = true;
if (i % prime[j] == 0) break;
}
}
int n;
cin >> n;
vector<int> b(MAXN);
int cntt = 0;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) {
if (a[i] == 2) {
if (i > 1
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。