携程笔试 携程笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

有担当的灰太狼又在摸鱼:零帧起手查看图片
点赞 评论 收藏
分享
吴offer选手:我卡在笔试才是最好笑的,甚至没给我发过笔试链接
投递哔哩哔哩等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务