2023 字节笔试 字节笔试题 0917

笔试时间:2023年9月17日 秋招

第一题

题目:小红查单词

小红拿到了一个仅由英文字母组成的字符串。她想知道某单词在该字符串中出现了多少次,你能帮帮她吗?请注意,小红会询问多次。

输入描述

第一行输入两个正整数n和q,代表字符串长度和询问次数。第二行输入一行长度为n的,仅由小写英文字母组成的字符串。代表小红拿到的字符串。接下来的q行,每行输入一个仅由小写英文字母组成的字符串,代表小红的每次查询。

1<=n,q<=10^5。每次查询的字符串长度不超过 10。

输出描述

输出q行,每行输出一个整数,代表该次查询的结果。

样例输入

10 3

bobobalice

bob

alice

red

样例输出

2

1

0

参考题解

字符串Hash,模拟十进制加法。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <map>
#include <string>
#include <vector>

constexpr unsigned long long base = 13331;
constexpr int maxLen = 10;

unsigned long long calculateHash(const std::string& s) {
    unsigned long long hash = 0;
    for (char c : s) {
        hash = hash * base + c;
    }
    return hash;
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    unsigned int n, q;
    std::cin >> n >> q;

    std::string s;
    std::cin >> s;

    std::vector<unsigned long long> h(n + 1, 0);
    std::vector<unsigned long long> p(n + 1, 1);

    for (int i = 1; i <= n; i++) {
        h[i] = h[i - 1] * base + s[i - 1];
        p[i] = p[i - 1] * base;
    }

    std::map<unsigned long long, int> mp;

    for (int len = 1; len <= maxLen; len++) {
        for (int i = 0; i < n; i++) {
            if (i + len > n) {
                break;
            }
            unsigned long long now = h[i + len] - h[i] * p[len];
            mp[now] += 1;
        }
    }

    for (unsigned int i = 0; i < q; i++) {
        std::string x;
        std::cin >> x;
        unsigned long long y = calculateHash(x);

        if (mp.count(y)) {
            std::cout << mp[y] << "\n";
        } else {
            std::cout << 0 << "\n";
        }
    }

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    static final long base = 13331;
    static final int maxLen = 10;

    static long calculateHash(String s) {
        long hash = 0;
        for (char c : s.toCharArray()) {
            hash = hash * base + c;
        }
        return hash;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int q = sc.nextInt();

        sc.nextLine(); // Consume newline

        String s = sc.nextLine();

        long[] h = new long[n + 1];
        long[] p = new long[n + 1];

        h[0] = 0;
        p[0] = 1;

        for (int i = 1; i <= n; i++) {
            h[i] = h[i - 1] * base + s.charAt(i - 1);
            p[i] = p[i - 1] * base;
        }

        Map<Long, Integer> mp = new HashMap<>();

        for (int len = 1; len <= maxLen; len++) {
            for (int i = 0; i < n; i++) {
                if (i + len > n) {
                    break;
                }
                long now = h[i + len] - h[i] * p[len];
                mp.put(now, mp.getOrDefault(now, 0) + 1);
            }
        }

        for (int i = 0; i < q; i++) {
            String x = sc.nextLine();
            long y = calculateHash(x);

            if (mp.containsKey(y)) {
                System.out.println(mp.get(y));
            } else {
                System.out.println(0);
            }
        }
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

def calculate_hash(s, base):
    hash_val = 0
    for c in s:
        hash_val = hash_val * base + ord(c)
    return hash_val

base = 13331
max_len = 10

n, q = map(int, input().split())
s = input()

h = [0] * (n + 1)
p = [1] * (n + 1)

for i in range(1, n + 1):
    h[i] = h[i - 1] * base + ord(s[i - 1])
    p[i] = p[i - 1] * base

mp = {}

for length in range(1, max_len + 1):
    for i in range(n):
        if i + length > n:
            break
        now = h[i + length] - h[i] * p[length]
        mp[now] = mp.get(now, 0) + 1

for _ in range(q):
    x = input()
    y = calculate_hash(x, base)
    if y in mp:
        print(mp[y])
    else:
        print(0)

第二题

题目:小红的魔法数组

小红有两个长度为 n 的数组,分别为 a和b。她可以施展魔法,先选择一个实数mul,获得c数组,其中ci=mul* ai+bi,小红想知道,她能获得的数组 c,最多有几个 0。

输入描述

一行一个整数 n,表示数组的长度。一行n个整数ai,表示数组a。一行n 个整数bi,表示数组 b。

1<=n<=10^5;-10^9<ai,bi<=10^9

输出描述

输出一个正整数,表示最多有几个0。

样例输入

4

2 4 6 7

1 2 3 4

样例输出

3

说明

选样mul=-0.5,得到e=[0,0,0,0.5],有3个0。

参考题解

将a[i]=0且b[i]=0的情况单独算,记为cnt,统计下b[i]/a[i]的结果数量取最大值,输出最大值与cnt的和。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;

    vector<double> a(n);
    vector<double> b(n);

    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    for (int i = 0; i < n; i++) {
        cin >> b[i];
    }

    map<double, int> mp;
    int zeroPairs = 0;
    int maxPairCount = 0;

    for (int i = 0; i < n; i++) {
        if (a[i] == 0 && b[i] == 0) {
            zeroPairs++;
        } else if (a[i] != 0) {
            double ratio = b[i] / a[i];
            mp[ratio]++;
            maxPairCount = max(maxPairCount, mp[ratio]);
        }
    }

    int result = maxPairCount + zeroPairs;
    cout << result << endl;

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2023 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

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